2016-07-31 10 views
1

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ループの何が問題ですか?

+0

あなたは 'echo'コマンドラインでの変数' ddir'にも遅れた拡張を使用する必要があります... – aschipfl

+0

'%のDDIR%変数を使用しているためempty.'です'!ddir!'を有効にして展開を有効にする必要があります。 – TessellatingHeckler

+0

ありがとうございます。今それは動作します。私はまだWindowsスクリプトの "delayedexpansion"コンセプトを理解していないと思います... – Pohl7534

答えて

0

変数の遅延展開とパス引数の拡張を正しく使用する必要があります。これを試してみて、私はすべての問題を知ってみましょう:

@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 /f %%a in ("!source[%%x]!") do (
    set "ddir=%%~na" & set "dst=%dest%\!ddir!" 
    echo "!source[%%x]!" "!dst!")) 
exit /b 
+0

@ Pohl7534スクリプトがうまくいく場合は、アップグレートし、このスレッドの答えを受け入れることを検討してください。 :) – sambul35

+0

内側のforループから '/ f'スイッチを削除すると、あなたの提案が有効になります。 @TessellatingHeckleが既に指摘しているように、元のスクリプトで変更する必要があったのは、 '!ddir!'変数にdelayedexpansionを使用していました。 – Pohl7534

+0

コメントはGoogleの適切な検索を許可していません。回答を見つけるには、回答ではなくコメントとして投稿する必要があります。 – sambul35

関連する問題