robocopyを使用してファイルをバックアップするWindowsバッチスクリプトを作成しています。私はlinux rsyncの動作を模倣したいと思います。これは、デフォルトでは最上位のソースディレクトリをデスティネーションパスに追加します。私は、ソースのサブディレクトリだけをコピー先としてコピーするので、robocopyがこれを行うことができることに気づいていません。したがって、次のスクリプトを使用して、最上位レベルのディレクトリをパスから抽出し、2つのネストされたforループを使用してそれを宛先パスに追加します。Windowsバッチスクリプト:ループが機能しないためにネストされました
以下のスクリプトは、機能していない部分に焦点を絞って簡略化しました。
"C:\Users\Sample User\Documents\keys" "C:\Users\Sample User\Documents\test\"
"C:\Users\Sample User\Documents\Custom Office Templates" "C:\Users\Sample User\Documents\test\"
% DDIR%変数が空である:
@echo off
setlocal enabledelayedexpansion
set source[0]=C:\Users\Sample User\Documents\keys
set source[1]=C:\Users\Sample User\Documents\Custom Office Templates
set dest=C:\Users\Sample User\Documents\test
:: range in for loop specified as (start,step,end)
for /l %%x in (0,1,1) do (
for %%a in ("!source[%%x]!") do (
set ddir=%%~nxa
)
echo "!source[%%x]!" "%dest%\%ddir%"
)
スクリプトは、以下の出力を生成します。したがって、私が意図しているように、ソースパスのトップレベルディレクトリはデスティネーションに追加されません。
"C:\Users\Sample User\Documents\keys" "C:\Users\Sample User\Documents\test\keys"
"C:\Users\Sample User\Documents\Custom Office Templates" "C:\Users\Sample User\Documents\test\Custom Office Templates"
私は外側ループと内側ループを別々にテストし、部分スクリプトは期待どおりに動作します。もちろん、内側のforループは、この場合、ソース配列全体にアクセスすることはできません。 forループ
表地:
@echo off
setlocal enabledelayedexpansion
set source[0]=C:\Users\Sample User\Documents\keys
set source[1]=C:\Users\Sample User\Documents\Custom Office Templates
:: range in for loop specified as (start,step,end)
for /l %%x in (0,1,1) do (
echo "!source[%%x]!"
)
出力:forループ
"C:\Users\Sample User\Documents\keys"
"C:\Users\Sample User\Documents\Custom Office Templates"
インナー:
@echo off
setlocal enabledelayedexpansion
set source[0]=C:\Users\Sample User\Documents\keys
set dest=C:\Users\Sample User\Documents\test
for %%a in ("!source[0]!") do (
set ddir=%%~nxa
)
出力:
"C:\Users\Sample User\Documents\keys" "C:\Users\Sample User\Documents\test\keys"
ネストされたforループの何が問題ですか?
あなたは 'echo'コマンドラインでの変数' ddir'にも遅れた拡張を使用する必要があります... – aschipfl
'%のDDIR%変数を使用しているためempty.'です'!ddir!'を有効にして展開を有効にする必要があります。 – TessellatingHeckler
ありがとうございます。今それは動作します。私はまだWindowsスクリプトの "delayedexpansion"コンセプトを理解していないと思います... – Pohl7534