在 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 为增量从 1 计数到 5?”这很简单:

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

下一个来源(FOR)

相关内容