2017-03-27 11 views
2

!DRIVE! Delayed Expansionが有効になっていることを考慮して作業する必要があります。それはなぜですか?なぜ、以下のコードは最初のケースでは機能しませんか?Windowsのバッチファイルで再帰的(/ R)ループが奇妙な動作をする理由

@echo off 
setlocal EnableDelayedExpansion 
SET "DRIVE=H:\" 

REM DOESN'T WORK 
FOR /R "!DRIVE!" %%S in (*) do (
    echo(%%S 
) 
pause 

REM WORKS 
FOR /R "%DRIVE%" %%S in (*) do (
    echo(%%S 
) 
pause 

REM WORKS 
FOR /R "H:\" %%S in (*) do (
    echo(%%S 
) 
pause 

答えて

1

that's how it worksfor /fオプションも、この問題を持っている)...ので。 Forは別のパーサーを持っています。定義は遅延拡張の影響を受けません(何が実行されているかを確認するためにecho offを試してみてください)。あなたは

@echo off 
setlocal EnableDelayedExpansion 
SET "DRIVE=H:\" 

set "cmd=for /R "%%DRIVE%%" %%a in (*) do @echo(%%a" 

for /F "delims=" %%x in ('!cmd!') do echo %%x 
(ネストされたために)(サブルーチン)2つの回避策の1

@echo off 
setlocal EnableDelayedExpansion 
SET "DRIVE="H:\"" 
call :rec !DRIVE! 
exit /b 0 


:rec 
FOR /R "%~1" %%S in (*) do (
    echo(%%S 
) 

を使用することができます

関連する問題