
Tengo un problema en el que necesito clonar una máquina virtual en varias máquinas para producción. Las máquinas tienen nombres que se asignan mediante variables y un puerto rdp también se asigna mediante una variable. Ambas variables se incrementan en 1 al final del guión. El problema que tengo es que no puedo entender cómo hacer un bucle en la máquina de creación y aumentar el código de valor variable hasta que el valor %M% esté en un número definido.
Aquí está mi código actual:
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
Lo he intentado con FOR, IF y WHILE pero no encuentro cómo hacerlo funcionar.
Cómo se veía 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
Respuesta1
Creo que solo necesitas revisar elFOR /?
ayudaun poco. Has mezclado un par de cosas diferentes que no funcionan. El cmd
intérprete eslimitadoen comparación con otros entornos de secuencias de comandos con los que quizás esté familiarizado.
Creo que todo lo que estás preguntando es "¿Cómo puedo utilizar FOR
en un archivo por lotes para contar del 1 al 5 en incrementos de 1?" Y eso es bastante simple:
FOR /L %%M IN (1, 1, 5) DO (
ECHO %%M
)
La segunda parte de su pregunta trata sobre incrementar otra variable dentro del FOR
bucle. Para eso, querrás buscarSETLOCAL EnableDelayedExpansion
. A continuación se muestra un ejemplo utilizando el script proporcionado.
@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
Respuesta2
huir deHabilitar expansión retrasadapodrías probar el siguiente enfoque con una llamada a procedimiento:
@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