Kombination von START /WAIT und /B möglich?
Ich stehe vor einem ziemlich BLÖDEN problem. Ich habe eine Liste von Befehlen erzeugt durch einen NAnt-Skript. Diese werden in einer bat-Datei. In jeder Zeile ich rufe eine exe-Datei mit mehreren Parametern. Die exe arbeitet auf einem Satz von Dateien und modifiziert Sie. Die Menge der Dateien ist immer das gleiche. Wir reden hier über ~1000 Anrufe von der exe, so dass, wenn jedes mal, wenn eine neue Konsole würde pop-up, die ich bekommen hatte performance-Probleme. "Kein problem", dachte ich und fügte hinzu START /B
zu jedem Befehl die Zeile, also nun die exe-Datei gestartet wird, im hintergrund die funktioniert wesentlich schneller.
Nun hier ist das problem: Wie ich bereits erwähnt habe, die exe arbeitet auf den gleichen Satz von Dateien, so passiert es manchmal, dass eine Datei nicht bearbeitet werden kann, weil es bereits geöffnet ist, indem Sie eine andere Instanz des Programms, das führt zu einem Absturz. Ich möchte noch hinzufügen, dass die /W
parameter für jeden Aufruf, um sicherzustellen, dass nie zwei Instanzen zur gleichen Zeit laufen. Aber dies irgendwie deaktiviert die /B
parameter.
Also meine Frage ist: ist es möglich, meine exe gestartet, im hintergrund UND zwingen meine batch zu warten, für jede Instanz zu beenden?
Bitte Sag mir nicht, dass diese hässlich ist. Ich weiß, aber ich kann nichts ändern das setup. Meine Firma arbeitet bereits mit diesem s*** seit Jahren und der einzige Punkt, wo ich änderungen vornehmen, ist die erzeugte bat-Datei.
Hier ist der code, der generiert bat:
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
...
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
- Wenn Sie beginnen
exe.exe
ohne alles, tut es öffnet sich ein neues Fenster?Start /b /wait
sollte die gleiche sein, starten Sie es direkt. - Du hast Recht, es ist eigentlich
start
. Ich habe bearbeitet Sie meine post. Ja, die exe.exe öffnet eine neue Konsole. Die exe selbst dauert nur einige Millisekunden, zu beenden, aber es dauert viel länger, um zu öffnen und schließen Sie die Konsole, die ich vermeiden mit/B
. - superuser.com/a/355342/439537
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
start /b
ohne/wait
und bauen Sie Ihre eigenen zu synchronisieren.Dieser wartet, bis die Datei
lock.tmp
ist nicht mehr gesperrt durch diestart
Befehl.In diesem Beispiel verwendet calc.exe für die demonstration.
Es kann nützlich sein, verwenden Sie den ping-Befehl, um zu warten Sie eine Sekunde, denn ohne ping, die cpu-Auslastung geht bis zu 100%.
Aber mein test sagt, dass die cpu nur zu 5% während der Wartezeit.
EDIT: Lösung mit direktem wartet
Diese nutzt die Tatsache, dass ein Rohr wird blockiert, bis der Erzeuger ist abgeschlossen.
Diese Lösung gar nicht braucht, extra-cpu-Leistung in eine Warteschleife und Sie können beginnen, die nächste Aufgabe sofort, nachdem ein Auftrag abgeschlossen ist.
start
mit derAFFINITY
option. Die 100% ist nur für einen Kern, die exe-Datei ausführen, die auf einem anderen KernKönnen Sie eine Datei als eine Flagge zu erkennen, dass die .exe-Datei ausgeführt wird. Erstellen Sie die flag-Datei vor jeder Ausführung des .exe-Datei, und entfernen Sie es, wenn die .exe endet. Dieser Weg, die Batch-Datei braucht nur zu warten, für die flag-Datei zu verschwinden, bevor Sie beginnen mit der nächsten .exe:
Bessere Leistung zu erzielen, passen Sie die
ping
Wartezeit in:waitForProcess
Unterroutine so wartet etwa die gleiche Zeit, dass die .exe nimmt zu Ende. Wenn die .exe-Datei dauert nur Millisekunden, können Sie ganz weglassenping
Befehl.del flag.txt
wird ausgeführt, unmittelbar bevor exe.exe ist fertig. Daher habe ich eine Umleitung statt. Sie können testen Sie es mit calc.exedel flag.txt
Befehl von einem&
Charakter, so dass diedel
ausgeführt, bis die .exe beendet wird.exe.exe
Programm ist nicht von dieser Art und damit die& del flag.txt
- Teil wird ausgeführt, bis die exe.exe -Programm beendet.@ECHO OFF :LOOP SET running=0 FOR /f "tokens=*" %%A IN ('tasklist^ /v^| findstr /i /c:"exe.exe"') DO SET running=1 IF %running%==1 GOTO LOOP
Aber, es ist ein " busy-wait Bau-und selbst wenn, dauert es nur 5% Verwendung einer single-core, ich hoffe es gibt eine elegantere Art und Weise.FOR /f
. Meine Lösung ist nur eine interneif exist
Befehl, das gleiche zu tun. 2. Der "eleganten Weg" ist ein subjektiver Begriff; zum Beispiel, meiner Meinung nach die eleganteste Lösung ist die einfachste. Sie hatte keine gebucht, zusätzliche Anforderungen, wenn Sie haben das Kopfgeld. 3. ich denke, dass ein einfacher Weg, um zu überprüfen, Lösungen zur Durchführung von tests basierend auf einem gegebenen Punkt, zum Beispiel die CPU-Auslastung Prozentsatz.Entschuldigen Sie mich, ich denke, es ist ein Durcheinander hier.
START
Befehl wird verwendet, um mehr als eine Instanz eines bestimmten Programms parallel (asynchron) mit anderen Instanzen des gleichen Programms. WennSTART
- Befehl wird verwendet, mit der /Warten, einschalten, dann wird das Endergebnis ist das gleiche, als wenn dieSTART
Befehl ist ganz weggelassen. Die Befehle, die platziert in einer Batch-Datei ausgeführt werden, in sequentieller Weise: die nächste beginnt, bis der Vorherige endet. Dies ist das gleiche Ergebnis erhalten Sie, wenn Sie führen die gleichen Befehle ohneSTART /W
.Ich denke, Sie wird Ihr problem lösen, wenn du weglassen, die
start /B /W
Teil der gespeicherten Befehle in der erzeugten Batch-Datei. Die Ausführung der .exe-Datei kann nicht öffnen Sie eine neue cmd.exe Fenster, aber wenn es funktioniert, dann diestart
Befehl haben, nicht ein Weg, um zu vermeiden, dass Verhalten! Könnten Sie uns mehr details über diesen Punkt?start /b
. Aberstart /b
betreibt mehrere Instanzen parallel (wie haben Sie darauf hingewiesen). Um dies zu vermeiden race-condition würde ich gerne/wait
. Also mein problem ist nicht überstart /wait
aber über/b
. Ich nehme an, Sie haben Recht, dass das nicht funktionieren mitstart
. Haben Sie andere Vorschläge wie meine exe 1000-mal sequentiell während der Unterdrückung, neue windows? Ich weiß, dass es einen Weg über VB-Skript, aber das ist auch viel zu langsam.