Schleife in einer Windows-Batchdatei

Schleife in einer Windows-Batchdatei

Ich habe ein Problem, bei dem ich eine virtuelle Maschine für die Produktion in mehrere Maschinen klonen muss. Die Maschinen haben Namen, die durch Variablen zugewiesen werden, und ein RDP-Port wird ebenfalls durch eine Variable zugewiesen. Beide Variablen werden am Ende des Skripts um 1 erhöht. Das Problem, das ich habe, ist, dass ich nicht herausfinden kann, wie ich den Code zum Erstellen der Maschine und Erhöhen des Variablenwerts so lange schleifen kann, bis der %M%-Wert eine definierte Zahl erreicht hat.

Hier ist mein aktueller Code:

SET VBoxManage="C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
SET M=1
SET P=25553

if %%M < 4 (

%VBoxManage% clonevm Win2012 --mode all --name M%M% --register
%VBoxManage% modifyvm M%M% --vrde on --vrdeauthtype null --vrdemulticon on --vrdeport %P%
SET /A M=%M%+1
SET /A P=%P%+1

ECHO Done
ECHO %M%
ECHO %P%
)

ECHO All cloning finished.

pause

Ich habe es mit FOR, IF und WHILE versucht, aber ich kann nicht herausfinden, wie es funktioniert.

So sah FOR aus:

SET VBoxManage="C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
SET M=1
SET P=25553

FOR /L (if %%M IN (1,1,5)
(
%VBoxManage% clonevm Win2012 --mode all --name M%M% --register
%VBoxManage% modifyvm M%M% --vrde on --vrdeauthtype null --vrdemulticon on --vrdeport %P%
SET /A M=%M%+1
SET /A P=%P%+1

ECHO Done
ECHO %M%
ECHO %P%
)

ECHO All cloning finished.

pause

Antwort1

Ich denke, Sie müssen nur dieFOR /?helfenein bisschen. Sie haben ein paar verschiedene Dinge zusammengemischt, die nicht funktionieren. Der cmdInterpreter istbegrenztim Vergleich zu anderen Skriptumgebungen, mit denen Sie möglicherweise vertraut sind.

Ich glaube, Sie fragen sich nur: „Wie zähle ich FORin einer Batchdatei in Schritten von 1 bis 5?“ Und das ist ganz einfach:

FOR /L %%M IN (1, 1, 5) DO (
    ECHO %%M
)

Der zweite Teil Ihrer Frage betrifft die Erhöhung einer anderen Variable innerhalb der FORSchleife. Dazu müssen Sie nachschlagenSETLOCAL EnableDelayedExpansion. Hier ist ein Beispiel mit dem von Ihnen bereitgestellten Skript.

@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET VBoxManage="C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
SET P=25553

FOR /L %%M IN (1, 1, 5) DO (
    %VBoxManage% clonevm Win2012 --mode all --name M%%M --register
    %VBoxManage% modifyvm M%%M --vrde on --vrdeauthtype null --vrdemulticon on --vrdeport !P!
    SET /A P=P + 1

    ECHO Done
    ECHO %%M
    ECHO !P!
)

ECHO All cloning finished.
PAUSE

Antwort2

Fliehen vorEnableDelayedExpansionSie könnten den folgenden Ansatz mit einem Prozeduraufruf versuchen:

@ECHO OFF >NUL
setlocal
SET "VBoxManage=C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
SET /A "P=25553"

FOR /L %%M IN (1,1,5) Do call :treat %%M

ECHO All cloning finished.
pause

endlocal
goto :eof

:treat
rem next two operational commands are ECHO-ed for debugging purposes
echo "%VBoxManage%" clonevm Win2012 --mode all --name M%~1 --register
echo "%VBoxManage%" modifyvm M%~1 --vrde on --vrdeauthtype null --vrdemulticon on --vrdeport %P%

ECHO Done M=%~1 P=%P%
SET /A "P+=1"
goto :eof

Nächste Quelle (FOR)UndSATZ

verwandte Informationen