Цикл в пакетном файле Windows

Цикл в пакетном файле Windows

У меня возникла проблема, когда мне нужно клонировать одну виртуальную машину в несколько машин для производства. Машины имеют имена, назначаемые переменными, и порт rdp также назначается переменной. Обе переменные увеличиваются на 1 в конце скрипта. Проблема в том, что я не могу понять, как зациклить код создания машины и увеличения значения переменной, пока значение %M% не достигнет определенного числа.

Вот мой текущий код:

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

Я пробовал использовать FOR, IF и WHILE, но не могу понять, как это работает.

Как выглядел FOR:

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

решение1

Я думаю, вам просто нужно пересмотретьFOR /?помощьнемного. Вы смешали несколько разных вещей, которые не будут работать. cmdИнтерпретаторограниченноепо сравнению с другими средами написания сценариев, с которыми вы, возможно, знакомы.

Я думаю, все, что вы спрашиваете, это «Как мне использовать FORв пакетном файле для счета от 1 до 5 с шагом 1?» И это достаточно просто:

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

Вторая часть вашего вопроса касается увеличения другой переменной в FORцикле. Для этого вам нужно будет поискатьSETLOCAL EnableDelayedExpansion. Вот пример использования предоставленного вами скрипта.

@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

решение2

Бежать отВключить отложенное расширениеВы можете попробовать следующий подход с вызовом процедуры:

@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

Следующий источник (ДЛЯ)иНАБОР

Связанный контент