Wenn Sie mehrere gleichzeitige Hintergrundprozesse ausführen, warten Sie, bis alle von ihnen unter Windows beendet sind

22563
Sergio

Weiß jemand, ob es ein cmd-Skript gibt, das das erledigt und / oder ein Befehlszeilentool für den Job bereit ist?

11
Andernfalls können Ihre Daten beschädigt werden! Santosh Kumar vor 12 Jahren 0
@Santosh: Was meinst du mit "Kann deine Daten schädigen?" In meinem speziellen Fall würden die Hintergrundaufgaben ihre eigenen unabhängigen Datensätze verarbeiten. Keine Gefahr gleichzeitiger Änderungen. Sergio vor 12 Jahren 8
Von der Win32-API-Seite aus denke ich * [WaitForMultipleObjects] (http://msdn.microsoft.com/de-de/library/windows/desktop/ms687028%28v=vs.85%29.aspx) mit bWaitAll = TRUE mach den Job. Es wäre nicht schwer, ein Programm zu schreiben, das nur die in einer Eingabedatei enthaltenen Programme ausgibt, wenn keine zufriedenstellenden Antworten vorliegen. grawity vor 12 Jahren 0
@grawity: ja, ich plane genau das zu tun, wenn nichts auftaucht (und den Code hier posten), aber mal sehen, ob ich das Rad nicht neu erfinden kann :) Sergio vor 12 Jahren 1
Das Rad neu zu erfinden ist eine gute Sache, wenn die derzeit vorhandenen Räder eckig sind ... grawity vor 12 Jahren 0

5 Antworten auf die Frage

5
RobW

Create the three batch files below. Main.bat launches 1.bat and 2.bat

1.bat and 2.bat write out temporary files for which main.bat checks. While 1.bat and 2.bat are working, main.bat reports back that processing is still occurring. When you hit enter on either 1.bat or 2.bat's open window, the temporary file is deleted, and the program exits. This simulates processing stopping for that .bat file. If you do this for both 1 and 2.bat, main.bat reports to you that processing has completed for these processes. You can make 1.bat and 2.bat do anything you want, so long as you clear the temporary file when you are finished. At this point main.bat can do anything you want it to do as well.

1.bat

echo %time% > 1.tmp pause del 1.tmp exit 

2.bat

echo %time% > 2.tmp pause del 2.tmp exit 

main.bat

@echo off start "1" 1.bat start "2" 2.bat @ping -n 1 127.0.0.1 > nul :loop @echo Processing...... if not exist *.tmp goto :next @ping -n 5 127.0.0.1 > nul goto loop :next @echo Done Processing! 
Ich kann Ihnen sagen, dass dieser Ansatz nicht so schwer ist, wie es scheint. Darüber hinaus ist es einfach zu warten, um die Logik zu erweitern und hinzuzufügen, und andere Personen können leicht trainiert werden. Normalerweise nehmen diese Dinge ihr eigenes Leben an ... RobW vor 12 Jahren 0
Ich bin mit dieser Lösung zufrieden. user1068446 vor 11 Jahren 0
1
Tom Wijsman

Die einzige Möglichkeit, dies zu tun, besteht darin, separate Stapeldateien (siehe start /?) zu starten, die die einzelnen Aufgaben ausführen, und nach Abschluss eine Textdatei zu schreiben. Anschließend prüfen Sie regelmäßig, ob die Textdateien erstellt wurden.

0
uSlackr

Sie können sich das Cmdlet Powershell Start-Job ansehen. Es sollte Ihnen dies ermöglichen. Mehr hier Powershell ist Microsofts Shell der Wahl. Es ist viel leistungsfähiger als Cmd-Skripte und wirkt sich gut auf die Investition Ihrer Zeit aus

Wartet das nicht, bis alle beendet sind? Tom Wijsman vor 12 Jahren 0
Es kann sicherlich davon abhängen, wie Sie es schreiben. Sie können die gestarteten Jobs abfragen, um festzustellen, ob sie abgeschlossen sind, und das Skript beenden, sobald sie abgeschlossen sind. Der Code auf dieser Seite verarbeitet eine ganze Liste von Jobs (jeweils drei) und wartet, bis sie beendet werden. uSlackr vor 12 Jahren 0
Ähm, habe noch nie etwas mit Powershell gemacht. Ich habe versucht, das Beispiel so zu ändern, dass beliebige Prozesse ausgeführt und gewartet werden können, bis sie abgeschlossen sind. Nach etwa 30 Minuten und 100 Suchvorgängen im M $ Technet gab ich auf. Es tut mir leid, wenn ich die Gefühle von jemandem verletzt habe, aber Powershell ist Mist. Es ist einfacher, dies in C zu tun (was ich denke, ist ...) Danke trotzdem, ich wette, jemand findet das noch nützlich. Sergio vor 12 Jahren 0
Wenn es eine Sache gibt, die PowerShell nicht ist, ist Mist und Sie werden meinen Gefühlen nicht schaden, wenn Sie sie nicht benutzen. Sie werden es jedoch nicht in 30 Minuten der Suche lernen. uSlackr vor 12 Jahren 0
PowerShell ist kein Mist, es ist nur eine vollständige Programmiersprache, die man lernen muss, anstelle einer herkömmlichen Sh-ähnlichen Syntax. Ich erinnere mich, dass ich mich genauso gefühlt hatte wie Perl, Python, Tcl, C # und jede andere Sprache, die ich ohne wirklichen Nutzen "for the lulz" zu lernen versuchte. (Als ich sie tatsächlich * brauchte *, ging es ziemlich leicht.) grawity vor 12 Jahren 1
0
Harry Johnston

Einfach genug, vorausgesetzt, die Prozesse benötigen keine Standardeingabe oder -ausgabe. Von der Befehlszeile oder in einer Batchdatei:

process1 | process2 | process3 | process4 

Dadurch werden alle vier Prozesse gleichzeitig ausgeführt und kehren nicht zurück, bis alle beendet wurden. (Mögliche Ausnahme: Wenn ein Prozess die Standardausgabe explizit schließt, wird er möglicherweise so behandelt, als wäre er beendet worden. Dies ist jedoch ungewöhnlich, da dies nur wenige Prozesse tun.)

Ich weiß nicht genau, wie viele Prozesse Sie auf diese Weise gleichzeitig starten können. Ich habe bis zu zehn ausprobiert.

Was ich bekomme ist, dass alle Prozesse in der Tat auf einmal gestartet werden, aber Prozess3 wird gewartet, bis Prozess4 abgeschlossen ist, Prozess2 wird gewartet, bis Prozess3 abgeschlossen ist, und so weiter. Dies ist übrigens von der klassischen Windows-Eingabeaufforderung. Sergio vor 12 Jahren 0
@Sergio: Was meinst du mit "Warten"? Harry Johnston vor 12 Jahren 0
0
OlivierR

Oder Sie können dies verwenden: http://www.out-web.net/?p=167

Ich habe es getan, es funktioniert, aber manchmal kommt es vor, dass die PID des fertigen Prozesses sofort von einem anderen gerade gestarteten Windows-Prozess erneut verwendet wird und die Erkennung des Endes Ihres Prozesses gefährlich / fehlerhaft macht.

Bitte fassen Sie zusammen, was der Link sagt. Wenn die Seite ausfällt, ist diese Antwort nicht hilfreich. Kevin Panko vor 10 Jahren 1