
我遇到一個問題,我需要將一台虛擬機器克隆到多台機器以進行生產。機器的名稱由變數分配,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