Windows バッチファイルでループする

Windows バッチファイルでループする

1 台の仮想マシンを複数のマシンに複製して実稼働する必要があるという問題があります。マシンには変数によって割り当てられた名前があり、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通訳は限定皆さんがよくご存知の他のスクリプト環境と比較すると、

あなたが尋ねているのは、「バッチ ファイルで 1 から 5 まで 1 ずつカウントするにはどうすればよいかFOR」ということだと思います。これは非常に簡単です。

FOR /L %%M IN (1, 1, 5) DO (
    ECHO %%M
)

質問の2番目の部分は、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)そしてセット

関連情報