bash "wait" Alternative für Windows Batch-Skript

1270
Hemant

In Bash gibt es eine Option, um auf den gesamten Hintergrundprozess zu warten, der von der aktuellen Shell mit dem waitBefehl gestartet wird .

z.B

#!/bin/bash { sleep 5; echo "waking up after 5 seconds"; } & { sleep 1; echo "waking up after 1 second"; } & wait echo all jobs are done! 

Wie mache ich das in Windows-Batch-Skript? Ich muss mehrere Befehle im Hintergrund ausführen und warten, bis alle beendet sind.

1
Es gibt keine einfache Möglichkeit, dies in cmd zu tun, von dem ich weiß (wenn Sie Ihre Jobs parallel ausführen möchten), aber wenn Sie Powershell verwenden könnten, gibt es ein Äquivalent namens "wait-job" (https://technet.microsoft). de / de-de / library / Hh849735.aspx) wmz vor 8 Jahren 0
Powershell ist nicht erlaubt :( Hemant vor 8 Jahren 0
Nur aus Neugier, was ist der Grund dafür, dass [PS nicht erlaubt ist]? wmz vor 8 Jahren 0

1 Antwort auf die Frage

3
dbenham

Wahrscheinlich möchten Sie, dass der START-Befehl die parallele Verarbeitung einleitet, obwohl dies über WMIC erfolgen könnte. Beachten Sie, dass das erste Argument als Fenstertitel behandelt wird, wenn es in Anführungszeichen steht. Deshalb ist mein erstes Argument eine leere Zeichenfolge. Die /BOption führt den Befehl in demselben Fenster aus. Entfernen Sie es, wenn Sie für jeden Befehl ein neues Fenster wünschen.

Es gibt keine einfachen systemeigenen Stapelbefehle oder -optionen, die warten, bis eine Reihe paralleler Prozesse abgeschlossen ist.

Ich leite gerne einen unbenutzten Datei-Handle für jeden Prozess in eine Datei um, wodurch eine exklusive Sperre hergestellt wird. Ich kann dann feststellen, ob ein Prozess noch läuft, indem ich versuche (CALL ), die gleiche Sperrdatei umzuleiten (effektiv eine Null-Operation). Wenn die Umleitung fehlschlägt, wird der Prozess noch ausgeführt. Erfolg zeigt an, dass der Prozess beendet wurde.

Der Test muss für jede der Sperrdateien in einer Abfrageschleife durchgeführt werden. Das Hinzufügen einer Verzögerung ist eine gute Idee, um zu verhindern, dass die Abrufschleife Ressourcen missbraucht.

@echo off set "lock=%temp%\%~nx0.lock" start "" /b "timeout" 5 9>"%lock%.1" start "" /b "timeout" 8 9>"%lock%.2" :wait timeout 1 /nobreak >nul 2>nul (for %%F in ("%lock%.*") do 9>"%%F" (call ) && del "%%F" || goto :wait) echo OK 

Wenn Sie über eine große Anzahl paralleler Prozesse verfügen und die Anzahl der gleichzeitigen Prozesse begrenzen möchten, können Sie an https://stackoverflow.com/a/11715437/1012053 interessiert sein