it-swarm.com.de

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

Ich habe ein "Setup" -Skript, das ich morgens ausführt und das alle Programme startet, die ich brauche. Einige von ihnen benötigen jetzt ein zusätzliches Setup der Umgebung, daher muss ich sie in kleine BAT-Skripts einpacken.

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

CALL env-script.bat führt es synchron aus, d. h. 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 in derselben Befehlszeile aus und lässt sie in einem wirklich unordentlichen Zustand (Ich sehe die Ausgabe der verschachtelten CMD.exe, die Tastatur ist für eine Weile tot, das Skript wird nicht ausgeführt).

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

81
Aaron Digulla

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 Parametern zu start, wie /min, wie Moshe darauf hinweist, wenn Sie nicht möchten, dass die neuen Fenster vor Ihnen erscheinen.

66
Joey

Zwei Jahre alt, aber der Vollständigkeit halber ...

Standard, Inline-Ansatz: (d. H. Verhalten, das Sie erhalten würden, wenn Sie & in Linux verwenden)

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

Anmerkungen: 1. CALL ist mit der .bat-Datei gekoppelt, da dies normalerweise der Fall ist .. (dh Dies ist nur eine Erweiterung des CMD /C CALL "foo.bat"-Formulars, um es asynchron zu machen. Normalerweise ist es erforderlich, Exit-Codes korrekt zu erhalten, dies ist jedoch keine -Ausgabe hier.); 2. Doppelte Anführungszeichen um die .bat-Datei werden nur benötigt, wenn der Name Leerzeichen enthält. (Der Name könnte ein Pfad sein. In diesem Fall ist die Wahrscheinlichkeit größer.) 

Wenn Sie die Ausgabe nicht möchten:

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

Wenn Sie möchten, dass der Schläger auf einer unabhängigen Konsole ausgeführt wird: (d. H. Ein anderes Fenster)

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

Wenn Sie möchten, dass das andere Fenster danach hängen bleibt:

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

Hinweis: Dies ist eigentlich ein schlechtes Formular, es sei denn, Sie haben Benutzer, die das geöffnete Fenster ausdrücklich als normale Konsole verwenden möchten. Wenn Sie möchten, dass das Fenster nur angezeigt wird, um die Ausgabe zu sehen, setzen Sie am besten eine PAUSE am Ende der bat-Datei. Oder fügen Sie nach der Befehlszeile noch ^& PAUSE hinzu:

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

Da START die einzige Möglichkeit ist, etwas aus einem CMD-Skript im Hintergrund auszuführen, würde ich empfehlen, dass Sie es weiterhin verwenden. Versuchen Sie/MIN anstelle des Modifizierers/B, damit das neu erstellte Fenster Sie nicht stört. Sie können auch die Priorität mit/LOW oder/BELOWNORMAL auf einen niedrigeren Wert setzen, was die Reaktionsfähigkeit Ihres Systems verbessern sollte.

7
Moshe

Anders als Vordergrund-/Hintergrundbegriff ..__ Eine andere Möglichkeit, das laufende Fenster auszublenden, ist vbscript, falls in Ihrem System noch vorhanden ist.

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

nennen Sie es als sth.vbs und nennen Sie es von bat, setzen Sie es in eine geplante Aufgabe, etc .. __ persönlich.

3
MeaCulpa

Dies funktioniert bei meiner Windows XP Home-Installation auf Unix-Weise:

call notepad.exe & 
0
MiiToo

Erstellen Sie eine neue C # Windows-Anwendung und rufen Sie diese Methode von main aus 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();
}
0
LegendLength

Eigentlich ist das mit dieser Option am Ende ganz einfach:

c:\start BATCH.bat -WindowStyle Hidden

0
user8832474