Auf "Call" oder "Nicht Anrufen" eine batch-Datei?
Wenn von innen eine bat-Datei, die Sie aufgerufen haben, eine andere batch-Datei hätte aber noch ein paar restlichen Vorgänge abgeschlossen, wie kann man sicherstellen, dass der Aufruf zum ersten bat-Datei wird nach der Fertigstellung oder Fehler, wird wieder die Datei, heißt es in der ersten Instanz?
Beispiel:
CD:\MyFolder\MyFiles
Mybatfile.bat
Copy afile toHere
oder
CD:\MyFolder\MyFiles
CALL Mybatfile.bat
COPY afile toHere
Was ist der Unterschied zwischen der Verwendung CALL
oder START
oder keiner von Ihnen überhaupt? Würde das irgendwelche Auswirkungen auf Sie, ob Sie zurückkehren würde, für die Ergebnisse der copy-Befehl oder nicht?
- Ja; Sie sollten
call
. - ok, fair , aber was ist der Unterschied, mechanik hinter der Szene? und was ist START? gleiche wie Anruf?
- möglich, Duplikat der Warum ruft eine verschachtelte batch-Datei, ohne das voranstellen von "call", um den line-Ausgang der übergeordneten batch-Datei?
- Ich würde nicht sagen, dass eine doppelte. Die OP in Erster Linie will ein Mechanismus, um zu garantieren, eine Rückkehr zu den Eltern, auch wenn es ein Fehler war. RUFEN Sie nicht zurück, im Fall von fatal syntax error. Die verlinkte Frage bezieht sich nicht auf dieses Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie schon andere gesagt haben,
CALL
ist der normale Weg, um ein bat-Datei innerhalb einer .bat und an den Aufrufer zurückgeben.Jedoch alle batch-Datei-Verarbeitung einzustellen (Kontrolle nicht an den Aufrufer zurückgeben) wenn die aufgerufene batch-Datei hat eine schwerwiegende syntax-Fehler, oder, wenn das aufgerufene Skript beendet mit EXIT-ohne /B-option.
Können Sie garantieren, Kontrolle an den Aufrufer zurückgeben (solange bleibt das Konsolenfenster geöffnet, natürlich), wenn Sie ausführen, das 2. script über die CMD-Befehl.
Aber dies hat eine Einschränkung, dass die Umwelt-Variablen, die von der aufgerufenen batch wird nicht beibehalten, nach der Rückkehr.
Ich bin mir nicht bewusst, eine gute Lösung zu garantieren, Rückgabe in allen Fällen und zu bewahren Umgebung ändert.
Wenn Sie wirklich brauchen, zu bewahren Variablen, während mit CMD, dann können Sie das "" Skript-schreiben der variable ändert, um eine temp-Datei, und dann haben die Anrufer Lesen der temp-Datei und re-stellen Sie die Variablen.
cmd /c
undCALL
: robvanderwoude.com/call.phpcall
,start
oder führen Sie einfach die zweite bat, alle Variablenset
durch die erste Fledermaus zur Verfügung stehen werden, die zweite bat.start /I
...call
notwendig ist .bat-oder .cmd-Dateien, da sonst die Kontrolle nicht an den Aufrufer zurückgegeben.Für exe-Dateien ist es nicht erforderlich.
Start
ist nicht das gleiche wiecall
erstellt es eine neue cmd.exe Instanz, so kann es laufen ein genannt batch-Datei asynchronoslyDen `CALL' - Anweisung wurde eingeführt, MS-DOS 3.3
Ist es den Aufruf von batch-Dateien in einer batch-Datei, ohne Abbruch der Ausführung der aufrufenden batch-Datei, und verwenden Sie die gleiche Umgebung für beide batch-Dateien.
Also in deinem Fall die Lösung ist die Verwendung
CALL
Okay, ich eigentlich gar nicht wirklich über die Tatsache, dass, wenn Sie rufen Sie einen Stapel (unabhängig von der 'Art', d.h. '.bat' oder '.cmd'), dass es nicht zurückkehren wird, wenn Sie nicht nennen.
Ich habe mich aber für einen anderen Grund, dass ich bin eigentlich ziemlich überrascht, dass niemand sonst hat. Vielleicht habe ich es verpasst. VIELLEICHT BIN ICH DER EINZIGE IN DER WELT, WER WEIß!! :O
Wahrscheinlich nicht, aber ich werde lassen Sie diese Kenntnis aus, weil hier super nützlich.
Wenn Sie anrufen Sie können über die binäre Logik Operatoren zu entscheiden, wie weiter Verfahren basiert auf der ERRORLEVEL Ergebnis. In der Tat, ich war immer baff, wie && und || gab es in DOS und KONNTE NICHT so genutzt werden. Nun, das ist, warum.
Der einfachste Weg, dies zu testen, erstellen Sie ein
return.cmd
mit notepad, oder von der Eingabeaufforderung etwa so:Werden Sie jetzt bemerken, geht der cursor in die nächste Zeile und hängt. Geben Sie ein:
Und drücken Sie dann [ENTER], und dann [STRG]-[Z] und die Datei wird erstellt. Gut! Sie können jetzt fühlen Sie sich frei, um zu versuchen die folgenden zwei Beispiele:
call return.cmd 0 && echo Huzzah! A Complete Success! (Or cover up...)
call return.cmd 123 || echo Oops! Something happened. You can check ERRORLEVEL if you want the tinest amount of additional information possible.
So was? Gut, laufen Sie wieder mit der 0 und der 123 getauscht und Sie sollten sehen, dass die Nachrichten NICHT drucken.
Vielleicht dieses multi-line Beispiel wird mehr Sinn machen. Ich benutze diese die ganze Zeit:
(Beachten Sie die 'anrufen' in der
||
Abschnitt vor dem zweiten "echo". Ich glaube, das ist, wie die Menschen bekam um nicht mit verspäteten expansion wieder in den Tag. Wenn Sie verzögerte Erweiterung aktiviert (über. setlocal EnableDelayedExpansion innerhalb einer batch ODER starten Sie eine Eingabeaufforderung mitcmd /v:on
dann können Sie einfach tun !ERRORLEVEL!.)... Das ist, wo ich mich entschuldigen und sagen, wenn Sie
if ERRORLEVEL
trauma in Ihrer Vergangenheit, die Sie sollten aufhören zu Lesen. Ich bekomme es. Vertrauen Sie mir. Ich dachte über die Zahlung jemand auf fiverr Remote-Typ für mich, aber der Vollständigkeits halber werde ich nur nehmen eine für das team und erwähnen, dass Sie können auch die folgenden zu prüfen, errorlevel:Wenn Sie noch nie getippt, dass, bevor Sie dann GUT! Sie werden länger Leben, ohne zu Lesen, warum genau Sie nicht immer die Ergebnisse, die Sie erwarten. Grausam ist das Wort, das Sie suchen, nicht 'schrullig'.
Ist der wichtige Teil, dass ich wirklich wollen, um sich über ist jedoch, dass, wenn Sie versuchen, diese und verwenden Sie NICHT 'nenne' es wird IMMER führen Sie die 'true' - Zweig. Probieren Sie es selbst!
Wenn ich etwas fehlt, oder wissen Sie einen besseren Weg, dies zu tun, lassen Sie es mich bitte wissen. Ich Liebe zu lernen, Sachen wie diese!
Zusätzliche Informationen, die ich erwähnt:
Ich habe seit geraumer Zeit bekannt, dass Sie können setzen Sie leitet, BEVOR Sie Befehle wie so:
Aber entdeckte ich zufällig, den anderen Tag, indem Sie ein dumdum, dass Sie anscheinend auch tun:
Und war WIRKLICH überrascht, eine
file.txt
Bestand "A B C". Es scheint, Sie können legen Sie Sie ÜBERALL, auch innerhalb der Befehl. Ich habe noch nie jemanden gesehen, der dies tun, noch es zu erwähnen, aber ich HABE Leute gesehen, die erwähnen, dass Sie können Präfix einer Linie mit Ihnen.Vielleicht ist es ein bug der exklusiv für Windows 10, oder so etwas. Wenn Sie eine andere version und möchte versuchen, es aus und lassen Sie mich wissen, mich würde interessieren, was Sie herausfinden.
Bleiben nerdy!