Kann festgestellt werden, ob eine Stapeldatei mit dem Befehl CALL oder ohne?

8

Das Problem ist, dass CALL Befehl verdoppelt das Caret-Zeichen ^ und macht double prozentual ein einzelner . Und in hybriden Dateien kann dies ein großes Problem sein. Oder wenn ein Schläger nicht mit% ausgeführt wird co_de% von einer anderen Fledermaus und Sie möchten den Benutzer warnen.

Das CALL (obwohl dies verwendet werden kann, wenn die Datei direkt von der Eingabeaufforderung aus ausgeführt wird) und %cmdcmdline% (eventuell kann dies mit verwendet werden diese ) Techniken sind meiner Meinung nach hier nicht sinnvoll.

Ich denke immer noch darüber nach, aber wenn jemand mit eleganter Lösung kommt, wird das großartig.

BEARBEITEN . Ein möglicher Ansatz besteht darin, die Batch-Rekursionsebene zu erkennen, obwohl eine zuverlässige Methode zur Überprüfung dieses Konfigurationseintrags erforderlich ist (ich habe keine Ahnung, wie es berechnet wird).

    
npocmaka 26.11.2015, 13:29
quelle

5 Antworten

3

Wie bei der Antwort von Jeb kann diese nicht unterscheiden, ob die aktuelle Batch-Datei aufgerufen wurde oder direkt wird aus einer aufgerufenen Batch-Datei aufgerufen. Dieser Code erkennt nur, ob der Ausführungskontext eine Batch-Datei ist (irgendwo war ein call , um diesen Punkt zu erreichen) oder die Befehlszeile (es gab kein call oder der Anfangskontext war die Befehlszeile). Nicht dasselbe, aber vielleicht könnte jemand einen besseren Weg daraus ziehen.

editiert nach Jebs Kommentar. Ich denke, die echo könnte mehr problematisch sein , aber das war es nicht, also ist der (goto) -Ansatz eindeutig eine bessere Option.

%Vor%

Und ja, natürlich, nicht kugelsicher. Dieser Code hat das gewöhnliche Stapelargument, das Probleme rund um %* behandelt.

    
MC ND 03.04.2017, 11:59
quelle
4

Wie ich Ihre Frage verstanden habe, wollen Sie eine Methode, die es einer file.bat -Datei ermöglicht zu bestimmen, ob sie über einen call -Befehl aufgerufen wurde, der in einer anderen Batch-Datei ausgeführt wurde oder nicht Dazu fügen Sie zusätzlichen Prüfcode in die Batch-Datei ein, richtig?

Nun, eine sehr einfache Methode, dies zu tun, ist einfach eine zusätzliche Zeile vor dem Aufruf Befehl in den Aufrufer Code einfügen, um eine "Call Flag" Variable zu definieren. Wenn diese Variable nicht in file.bat definiert ist, wurde sie nicht über call :

aufgerufen

Im Anrufercode:

%Vor%

In der Datei.bat:

%Vor%     
Aacini 26.11.2015 23:19
quelle
4

Wenn ich Ihre Frage verstehen kann: Sie möchten eine Methode, mit der ein Stapelscript feststellen kann, ob es über einen call -Befehl aus einem anderen Stapelscript aufgerufen wurde. Das nächste 33939966test.bat -Skript zeigt den möglichen Ansatz: Erzwinge die Verwendung des obligatorischen Parameters "^%%%%" wie folgt:

%Vor%

Ausgabe über die Befehlszeile:

%Vor%

Ausgabe von einem Aufrufer:

%Vor%

wobei 33939966myCaller.bat wie folgt lautet ( kopieren und einfügen Teil enthalten):

%Vor%

Beachten Sie, dass der obige Ansatz nicht kugelsicher ist, da wir uns ein falsches positives Ergebnis von der Befehlszeile vorstellen könnten:

%Vor%

Vielleicht könnte die Kombination mit (goto) Technik helfen?

    
JosefZ 27.11.2015 09:50
quelle
3

Es kann mit einigen bösen Tricks gemacht werden, also ist keine perfekte Lösung .
Ich zähle, wie viele Aufrufe erforderlich sind, um einen Stackoverflow zu erhalten, und dann vergleiche ich den Wert mit dem Wert aus der Fehlerausgabe.

Aber es ist notwendig, einen zweiten cmd.exe-Prozess zu starten, da der Stackoverflow die erste Batch-Instanz beendet

%Vor%     
jeb 27.11.2015 08:56
quelle
2

Low-Tech-Lösung, legen Sie einfach eine Umgebungsvariable fest und überprüfen Sie sie. so:

caller.cmd:

%Vor%

genannt.cmd

%Vor%     
Jahmic 21.10.2017 07:19
quelle

Tags und Links