我遇到一个问题,我需要将一台虚拟机克隆到多台机器中进行生产。这些机器的名称由变量分配,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