Wie führe ich eine Fledermausdatei im Hintergrund aus einer anderen Fledermausdatei aus?

89

Ich habe ein "Setup" -Skript, das ich am Morgen ausführe und das alle Programme startet, die ich brauche. Jetzt benötigen einige von ihnen eine zusätzliche Einrichtung der Umgebung, sodass ich sie in kleine BAT-Skripte einschließen muss.

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 andere Instanz von CMD.exe in derselben Eingabeaufforderung aus und belässt sie in einem sehr 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.batergibt das gleiche Ergebnis. Keine der Flaggen in CMD scheint meiner Rechnung zu entsprechen.

Aaron Digulla
quelle

Antworten:

71

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

Kombiniert man dies mit Parametern start, wie zum Beispiel /min, wie Moshe darauf hingewiesen , wenn Sie nicht die neuen Fenster zu laichen vor Sie wollen.

Joey
quelle
1
Okay, das funktioniert, ist aber nicht 100% perfekt: Nachdem ich in "Test 2" "RETURN" gedrückt habe, wird dieses Fenster nicht geschlossen. Irgendwelche Ideen?
Aaron Digulla
Sie können den erzeugten Stapeln "exit" hinzufügen, um sie anschließend wieder zu schließen. Sorry, habe nicht so weit getestet :)
Joey
139

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

Standard-Inline-Ansatz: (dh Verhalten, das bei Verwendung &unter Linux auftreten würde)

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

Anmerkungen: 1. CALList mit der .bat-Datei gekoppelt, da dies normalerweise der Fall ist. (Dies ist nur eine Erweiterung des CMD /C CALL "foo.bat"Formulars, um es asynchron zu machen. Normalerweise ist es erforderlich, Exit-Codes korrekt abzurufen, aber das ist kein Problem Hier.); 2. Doppelte Anführungszeichen um die .bat-Datei sind nur erforderlich, 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: (dh einem anderen Fenster)

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

Wenn Sie möchten, dass das andere Fenster danach herumhängt:

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

Hinweis: Dies ist eine schlechte Form, es sei denn, Sie haben Benutzer, die das geöffnete Fenster speziell als normale Konsole verwenden möchten. Wenn Sie nur möchten, dass das Fenster bleibt, um die Ausgabe zu sehen, ist es besser, ein PAUSEam Ende der Bat-Datei zu setzen. Oder fügen Sie ^& PAUSEnach der Befehlszeile Folgendes hinzu:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
Antak
quelle
10
&ist ein "und dann" (Terminologie?) Operator. (zB cmd1 & cmd2Mittel tun „cmd1“ und dann „cmd2“. Im Gegensatz zu dem &&Operator, die Ausführung von „cmd2“ hängt nicht von dem erfolgreichen Ausgang von „cmd1“) . Das ^dem entweicht , &so dass es in CMD Argumente geht stattdessen verbraucht zu werden und von derselben Konsole ausgeführt werden, auf der START ausgeführt wurde.
Antak
Das ist sehr hilfreich, danke. Ich war gerade dabei , in den Hafen einige Skripte auf Linux, weil andere Führungen startund cmdnicht die volle Funktionalität geben habe ich gesucht. Ihre Antwort nagelt es.
Iterator
3
Wenn Sie die Ausgabe nicht möchten, muss die Umleitung maskiert werden, damit sie an CMD übergeben wird. Auch CALL wird nicht benötigt:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
Dbenham
1
@dbenham: Obwohl das, was Sie sagen, Sinn macht, START /B "" CMD /C PING 127.0.0.1 >NULscheint es trotzdem zu funktionieren und nichts wird ausgegeben. (Wahrscheinlich, weil er CMDdie STARTE / A-Handles erbt .) Ich denke, der Unterschied besteht darin, dass Sie die START(Fehler-) Ausgabe intakt halten möchten , was wahrscheinlich eine gute Idee ist. CALList nur da, weil ich dachte, es ist eine gute Praxis, sie zu behalten. (dh die Nichtverwendung CALLfür synchrone Fledermausrufe führt zu unvorhersehbaren Exit-Codes CALL.
Daher kopple
7

Da START die einzige Möglichkeit ist, etwas im Hintergrund über ein CMD-Skript auszuführen, würde ich empfehlen, dass Sie es weiterhin verwenden. Versuchen Sie anstelle des Modifikators / B / MIN, damit Sie das neu erstellte Fenster nicht stört. Außerdem können Sie mit / LOW oder / BELOWNORMAL die Priorität auf einen niedrigeren Wert einstellen, um die Reaktionsfähigkeit Ihres Systems zu verbessern.

Moshe
quelle
-1 Das Problem ist, dass START beim Starten einer BAT-Datei kein neues Fenster erstellt. Stattdessen wird das aktuelle Fenster wiederverwendet und die beiden E / A-CMD-Prozesse gemischt.
Aaron Digulla
4
Es wird kein neues Fenster erstellt, da Sie das Flag / B verwenden. Entfernen Sie es.
Moshe
5

Andere als Vordergrund- / Hintergrundbegriff. Eine andere Möglichkeit, das laufende Fenster auszublenden, ist vbscript, sofern 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 sth.vbs und rufen Sie es von bat aus auf, geben Sie eine geplante Aufgabe ein usw. Persönlich werde ich vbs ohne Eile auf jedem Windows-System deaktivieren, das ich verwalte :)

MeaCulpa
quelle
Für meinen speziellen Anwendungsfall war dies tatsächlich die einzige Lösung, die ich zur Arbeit bringen konnte ...
Ben
0

Erstellen Sie eine neue C # Windows-Anwendung und rufen Sie diese Methode über 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();
}
LegendLength
quelle
2
Ähm ... Ich hatte gehofft, dass für so etwas Einfaches Visual Studio nicht installiert werden muss ...
Aaron Digulla
1
Bis PowerShell zu 100% verfügbar ist, ist C # wirklich übertrieben.
Jim
2
Aaron: Der C # -Compiler ist in .NET Framework 2 enthalten, sodass Sie einfach Code in einem Texteditor bearbeiten und kompilieren können. Da dies in einer Batch-Datei durchaus möglich ist, würde ich auch sagen, dass C # übertrieben ist.
Joey
0

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

call notepad.exe & 
MiiToo
quelle
6
Ich denke, das funktioniert nur durch Zufall und das & ist nicht notwendig.
Sam Watkins
2
Ja, notepad.exe ist zunächst asynchron.
Antak
0

Eigentlich ist das mit dieser Option am Ende ganz einfach:

c: \ start BATCH.bat -WindowStyle Hidden

user8832474
quelle
Der Windows-Befehl starthat keine -WindowStyleOption.
Stephan
@Stephan Arreed. Der seltsame Pfad ( C:` instead of C: \ Windows`) deutet darauf hin, dass er irgendwo im Internet ein Tool gefunden und auf seine Festplatte kopiert hat.
Aaron Digulla