
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 cmd
Interpreter istbegrenztim Vergleich zu anderen Skriptumgebungen, mit denen Sie möglicherweise vertraut sind.
Ich glaube, Sie fragen sich nur: „Wie zähle ich FOR
in 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 FOR
Schleife. 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