Bucle en un archivo por lotes de Windows

Bucle en un archivo por lotes de Windows

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 cmdinté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 FORen 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 FORbucle. 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

Siguiente fuente (PARA)yCOLOCAR

información relacionada