Wie führe ich eine Bat-Datei im Hintergrund aus einer anderen Bat-Datei aus?

Ich habe ein “Setup” -Skript, das ich am Morgen laufen lasse, das alle Programme startet, die ich brauche. Jetzt brauchen einige von denen ein zusätzliches Setup der Umgebung, also muss ich sie in kleine BAT-Skripte verpacken.

Wie führe ich ein solches Skript unter Windows XP im Hintergrund aus?

CALL env-script.bat führt es synchron aus, dh das Setup-Skript kann erst fortgesetzt werden, nachdem der Befehl im env-Skript beendet wurde.

START/B env-script.bat führt eine weitere Instanz von CMD.exe an derselben Eingabeaufforderung aus, wodurch es in einem wirklich unordentlichen Zustand bleibt (ich sehe die Ausgabe der verschachtelten CMD.exe, die Tastatur ist für eine Weile tot, das Skript nicht) hingerichtet).

START/B CMD env-script.bat liefert das gleiche Ergebnis. Keines der Flags in CMD scheint meiner Rechnung zu entsprechen.

   

Eigentlich funktioniert das Folgende gut für mich und erstellt neue Fenster:

test.cmd:

 @echo off call "cmd /c start test2.cmd" call "cmd /c start test3.cmd" echo Foo pause 

test2.cmd

 @echo off echo Test 2 pause exit 

test3.cmd

 @echo off echo Test 3 pause exit 

Kombinieren Sie das mit den zu start Parametern wie /min , da Moshe darauf hinwies, dass die neuen Fenster nicht vor Ihnen erscheinen sollen.

Zwei Jahre alt, aber der Vollständigkeit halber …

Standard, Inline-Ansatz: (dh Verhalten, das man bei Verwendung von & in Linux erhält)

 START /B CMD /C CALL "foo.bat" [args [...]] 

Anmerkungen: 1. CALL ist gepaart mit der .bat-Datei, da wo es normalerweise geht .. (dh Dies ist nur eine Erweiterung zu dem CMD /C CALL "foo.bat" -Form, um es asynchron zu machen. Normalerweise ist es erforderlich, um korrekt Exit-Codes erhalten, aber das ist hier kein Problem.); 2. Anführungszeichen um die .bat-Datei werden nur benötigt, wenn der Name Leerzeichen enthält. (Der Name könnte ein Pfad sein, in welchem ​​Fall es wahrscheinlicher ist.).

Wenn Sie die Ausgabe nicht möchten:

 START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1 

Wenn der Schläger auf einer unabhängigen Konsole laufen soll: (zB ein anderes Fenster)

 START CMD /C CALL "foo.bat" [args [...]] 

Wenn du willst, dass das andere Fenster hinterher hängt:

 START CMD /K CALL "foo.bat" [args [...]] 

Hinweis: Dies ist eigentlich eine schlechte Form, es sei denn, Sie haben Benutzer, die das geöffnete Fenster als normale Konsole verwenden möchten. Wenn das Fenster nur PAUSE werden soll, um die Ausgabe zu sehen, ist es besser, am Ende der Bat-Datei eine PAUSE zu setzen. Oder noch, fügen Sie ^& PAUSE nach der Befehlszeile hinzu:

 START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE 

Da START die einzige Möglichkeit ist, etwas im Hintergrund von einem CMD-Skript auszuführen, würde ich empfehlen, es weiterhin zu verwenden. Versuchen Sie anstelle des / B-Modifiers / MIN, damit das neu erstellte Fenster Sie nicht stört. Außerdem können Sie die Priorität mit / LOW oder / BELOWORMAL etwas niedriger einstellen, was die Reaktion Ihres Systems verbessern sollte.

Anders als Vordergrund- / Hintergrundbegriff. Eine andere Möglichkeit, ein laufendes Fenster zu verbergen, ist via VBScript, wenn es in Ihrem System noch verfügbar ist.

 DIM objShell set objShell=wscript.createObject("wscript.shell") iReturn=objShell.Run("yourcommand.exe", 0, TRUE) 

Nennen Sie es als etw.vbs und rufen Sie es von Fledermaus, in geplante Aufgabe, etc. Persönlich werde ich vbs ohne Eile in jedem Windows-System, das ich verwalte 🙂

Erstellen Sie eine neue C # Windows Anwendung und rufen Sie diese Methode von main auf:

 public static void RunBatchFile(string filename) { Process process = new Process(); process.StartInfo.FileName = filename; // suppress output (command window still gets created) process.StartInfo.Arguments = "> NULL"; process.Start(); process.WaitForExit(); } 

Dies funktioniert auf meiner Windows XP Home-Installation, der Unix-Art:

 call notepad.exe & 

Eigentlich ist das mit dieser Option am Ende recht einfach:

c: \ start BATCH.bat -WindowStyle Versteckt