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).
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.
Und ja, natürlich, nicht kugelsicher. Dieser Code hat das gewöhnliche Stapelargument, das Probleme rund um %*
behandelt.
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
:
Im Anrufercode:
%Vor%In der Datei.bat:
%Vor% 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:
Ausgabe über die Befehlszeile:
%Vor%Ausgabe von einem Aufrufer:
%Vor% wobei 33939966myCaller.bat
wie folgt lautet ( kopieren und einfügen Teil enthalten):
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?
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%Tags und Links batch-file