Loop em um arquivo em lotes do Windows

1

Eu tenho um problema em que 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 o loop da máquina de criação e aumentar o código de valor da variável até que o valor% M% esteja em um número definido.

Aqui está o 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 fazer isso funcionar.

Como FOR pareceu:

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
    
por Dempa 23.02.2015 / 11:50

2 respostas

3

Acho que você só precisa rever a FOR /? help um pouco. Você misturou algumas coisas diferentes que não funcionam. O interpretador cmd é limitado comparado a outros ambientes de script com os quais você pode estar familiarizado.

Acho que tudo o que você está perguntando é "Como usar o FOR em um arquivo em lotes 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 loop FOR . Para isso, você vai querer pesquisar SETLOCAL EnableDelayedExpansion . Aqui está um exemplo usando seu 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
    
por 23.02.2015 / 12:59
2

Para fugir de EnableDelayedExpansion , você pode 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 (FOR) e SET

    
por 23.02.2015 / 13:25