2 Stimmen

wie man mehrere .cmd-Dateien parallel ausführt

Ich habe 4 .cmd-Dateien. Ich möchte dann parallel 2 auf einmal ausführen. Sagen wir, meine Dateien sind: 1.cmd, 2.cmd, 3.cmd, 4.cmd

Ich möchte 1.cmd und 2.cmd parallel laufen lassen. Wenn nun eine dieser Dateien endet, möchte ich 3.cmd und dann 4.cmd ausführen. Kurz gesagt, ich möchte, dass zu jedem beliebigen Zeitpunkt 2 der .cmd-Dateien ausgeführt werden.

Ich verwende den Befehl Start für die parallele Ausführung. Aber ich bin neu in der Skripterstellung und bin verwirrt, wie ich die oben erwähnte Art der Ausführung der Cmd-Dateien furmulieren kann.

Für jede Hilfe wären wir dankbar.

Danke Debjani

1voto

Joey Punkte 329386

Ich habe eine Antwort gegeben auf "Parallele Ausführung von Shell-Prozessen" einmal, hier zitiert:

Klingt eher so, als wollten Sie die Powershell 2. Sie können jedoch neue cmd Windows (oder andere Prozesse) durch Verwendung von start , siehe auch dies Antwort. Wahrscheinlich müssen Sie aber einige andere Werkzeuge und ein wenig Tricks, um so etwas wie einen "Prozess-Pool" zu erstellen (um nur ein Maximum an von n Instanzen zur gleichen Zeit). Letzteres können Sie erreichen, indem Sie tasklist /im und zählen, wie viele bereits vorhanden sind ( for Schleife oder wc , falls zutreffend) und warten Sie einfach ( ping -n 2 ::1 >nul 2>&1 ) und überprüfen Sie noch einmal, ob Sie eine neue Prozess erzeugen können.

Ich habe einen kleinen Test zusammengeschustert Stapel für diese Aufgabe zusammengestellt:

@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof

:loop
call :checkinstances
if %INSTANCES% LSS 5 (
    rem just a dummy program that waits instead of doing useful stuff
    rem but suffices for now
    echo Starting processing instance for %1
    start /min wait.exe 5 sec
    goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping

kehrt sofort zurück; rem ansonsten einfach eine unbenutzte Adresse verwenden und -n 1) echo Warten auf das Schließen von Instanzen ... ping -n 2 ::1 >nul 2>&1 rem Springe zurück, um zu sehen, ob wir jetzt einen neuen Prozess erzeugen können goto Schleife goto :eof

:checkinstances
rem this could probably be done better. But INSTANCES should contain

die Anzahl der laufenden Instanzen danach. for /f "usebackq" %%t in ( tasklist /fo csv /fi "imagename eq wait.exe"^|wc -l ) setzen INSTANZEN=%%t goto :eof

Er erzeugt maximal vier neue Prozesse, die parallel ausgeführt und minimiert. Die Wartezeit muss angepasst werden, je nachdem, wie viel viel jeder Prozess macht und wie lange er ausgeführt wird. Wahrscheinlich müssen Sie auch den Prozessnamen anpassen, nach dem Taskliste sucht, wenn Sie gerade etwas anderes tun.

Es gibt keine Möglichkeit, die Zahl der Prozesse, die von diesem Stapel erzeugt werden Stapel erzeugt werden. Eine Möglichkeit wäre, eine eine Zufallszahl zu Beginn des Stapels zu erzeugen des Stapels ( %RANDOM% ) und erstellen Sie eine Helper-Batch, der die Verarbeitung vornimmt (oder das Verarbeitungsprogramm startet), aber der seinen Fenstertitel auf einen Parameter setzt:

@echo off
title %1
"%2" "%3"

Dies wäre ein einfacher Batch, der die seinen Titel auf den ersten Parameter setzt und dann den zweiten Parameter mit dem dritten als Argument ausführt. Sie können dann in der Taskliste filtern, indem Sie nur Prozesse mit dem angegebenen Fenstertitel Titel ( tasklist /fi "windowtitle eq ..." ). Dies sollte recht zuverlässig funktionieren zuverlässig und verhindert zu viele falsche positive Ergebnisse. Suchen Sie nach cmd.exe wäre eine schlechte Idee, wenn Sie noch eine einige Instanzen laufen, da dies die Anzahl der Ihren Pool an Arbeitsprozessen einschränkt.

Sie können verwenden %NUMBER_OF_PROCESSORS% um eine sinnvolle Vorgabe zu schaffen, wie wie viele Instanzen erzeugt werden sollen.

Sie können dies auch leicht anpassen, um Folgendes zu verwenden psexec um die Prozesse zu starten aus der Ferne zu starten (aber das wäre nicht sehr praktikabel da Sie Administratorrechte auf dem anderen Rechner haben müssen auf dem anderen Rechner haben müssen, sowie das Kennwort im Batch angeben). Sie müssten dann allerdings die Prozessnamen für die Filterung verwenden.

0voto

Edward Leno Punkte 6139

Ich habe dies nicht ausprobiert, aber ich nehme an, dass Sie dies mit PowerShell tun können. Verwenden Sie diese Art von Struktur:

http://www.dougfinke.com/blog/index.php/2008/01/30/run-your-powershell-loops-in-parallel/

Innerhalb dieses Beispiels sollten Sie in der Lage sein, cmd/bat-Dateien auszuführen.

In folgendem Thread finden Sie einige Ideen (möglicherweise ein Duplikat?)

Parallele Ausführung von Shell-Prozessen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X