Loop em um arquivo em lote do Windows

Loop em um arquivo em lote do Windows

Estou com um problema onde preciso clonar uma máquina virtual em várias máquinas para produção. As máquinas possuem nomes atribuídos por variáveis ​​e uma porta RDP também é atribuída por uma variável. Ambas as variáveis ​​são aumentadas em 1 no final do script. O problema que tenho é que não consigo descobrir como fazer um loop na máquina de criação e aumentar o código do valor da variável até que o valor% M% esteja em um número definido.

Aqui está meu código atual:

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

Eu tentei com FOR, IF e WHILE, mas não consigo descobrir como fazê-lo funcionar.

Como era o 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

Responder1

Acho que você só precisa revisar oFOR /?ajudaum pouco. Você misturou algumas coisas diferentes que não funcionarão. O cmdintérprete élimitadoem comparação com outros ambientes de script com os quais você pode estar familiarizado.

Acho que tudo o que você está perguntando é "Como faço para usar FORum arquivo em lote para contar de 1 a 5 em incrementos de 1?" E isso é bastante simples:

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

A segunda parte da sua pergunta é sobre como incrementar outra variável dentro do FORloop. Para isso, você vai querer pesquisarSETLOCAL EnableDelayedExpansion. Aqui está um exemplo usando o script fornecido.

@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

Responder2

Fugir deHabilitar Expansão Atrasadavocê poderia tentar a próxima abordagem com uma chamada de procedimento:

@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

Próxima fonte (PARA)eDEFINIR

informação relacionada