web-dev-qa-db-ja.com

バッチファイルの「for」ループ-複数行

バッチファイルで次の行が機能するのはなぜですか?

 for  %%a in ("C:\Test\*.txt") do set FileName=%%~a
 echo Filename is: %FileName%

しかし、これらはしませんか?:

 for  %%a in ("C:\Test\*.txt") do (
     set FileName=%%~a
     echo Filename is: %FileName%
 )

「a」変数が2行目まで保持されないようです。なぜこれなのか、2番目の例のように「a」の内容をどのように使用するのですか?

23
Ekins86

これは、括弧内のすべてが1行としてロードされるためです。したがって、%FileName%は、(実行時に)設定される前に(ロード時に)拡張されます。 2番目の形式を使用する必要がある場合は、遅延拡張を有効にする必要があります。ファイル名に!が含まれていると、問題が発生します。これは、ファイル名に括弧がなければ機能します。

 setlocal enabledelayedexpansion
 for  %%a in ("C:\Test\*.txt") do (
     set FileName=%%~a
     echo Filename is: !FileName!
 )
28
RGuggisberg