4

私のデスクトップには、「test」という名前のフォルダーがあります。このフォルダ内には、「file1.txt」「file2.txt 」の 2 つのファイルがあります。

次の簡単なバッチ スクリプトを見てください。

@ECHO OFF

SET test="C:\Users\Tyler\Desktop\test"

ECHO %test%
FOR /R %test% %%F IN (*) DO (
    ECHO %%F
)

ご想像のとおり、次のように出力されます。

"C:\Users\Tyler\Desktop\test"
C:\Users\Tyler\Desktop\test\file1.txt
C:\Users\Tyler\Desktop\test\file2.txt

次に、このバリエーションを見てみましょう。

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

SET test="C:\Users\Tyler\Desktop\test"

ECHO !test!
FOR /R !test! %%F IN (*) DO (
    ECHO %%F
)

ENDLOCAL

その出力に違いはないと思います。ただし、次のとおりです。

"C:\Users\Tyler\Desktop\test"

!test!ラインで展開されているように見えますが、ラインECHO !test!ではなく、. もちろん、これは有効なパスではないため、FOR /R ループは繰り返されません。FOR /R !test!!test!

どうしてこれなの?私は何が欠けていますか?

4

1 に答える 1

5

FOR の動作が ECHO と異なる理由は、バッチ パーサー (cmd.exe )FORIFおよびREM.

したがって、遅延展開はここのパラメーターに対しては機能せず、括弧内の引数に対してのみ機能します。

FORパーサーは、特別なパーサー ルールに切り替える直前にパーセント拡張フェーズを実行するため、パラメーターに対してパーセント拡張のみが機能します。

ブロック内にいるためにパーセント展開を使用できない場合は、コードを独自の関数に移動して呼び出すことができます。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET test="C:\Users\Tyler\Desktop\test"

ECHO !test!
call :doMyLoop test
exit /b

:doMyLoop
set "arg=!%1!"
FOR /R %arg% %%F IN (*) DO (
    ECHO %%F
)
于 2015-05-19T20:27:01.223 に答える