在 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)

相關內容