2

私が作成したバッチ スクリプトの変数割り当てで奇妙な動作が発生しています。問題を再現するために作成できる最も簡単な例を次に示します。ファイルを作成しましたtype pos.bat

@echo on
FOR /R ".\" %%F IN (*.txt) DO (
echo Look: %%F
set file=%%~dpF%%~nF
echo %file%
)

2 つの *.txt ファイルを含むディレクトリで、サブディレクトリに 1 つ:

pos/
    |-pos.bat
    |-file1.txt
    |dir/
         |-file2.txt

次の出力が得られます。

F:\pos>pos.bat
F:\pos>FOR /R ".\" %F IN (*.txt) DO (
echo Look: %F
 set file=%~dpF%~nF
 echo F:\pos\dir\file2
)

F:\pos>(
echo Look: F:\pos\file1.txt
 set file=F:\pos\file1
 echo F:\pos\dir\file2
)
Look: F:\pos\file1.txt
F:\pos\dir\file2

F:\pos>(
echo Look: F:\pos\dir\file2.txt
 set file=F:\pos\dir\file2
 echo F:\pos\dir\file2
)
Look: F:\pos\dir\file2.txt
F:\pos\dir\file2

ループの最初の繰り返しで の値を%file%元に戻すべきではありませんか? F:\pos\file1.txtまた、スクリプトの呼び出し間で `%file% の値が保持されていることに驚きました。スクリプトへの最初の呼び出しは、意図したとおりに動作しました。

F:\pos>FOR /R ".\" %F IN (*.txt) DO (
echo Look: %F
 set file=%~dpF%~nF
 echo
)

F:\pos>(
echo Look: F:\pos\file1.txt
 set file=F:\pos\file1
 echo
)
Look: F:\pos\file1.txt
ECHO is on.

F:\pos>(
echo Look: F:\pos\dir\file2.txt
 set file=F:\pos\dir\file2
 echo
)
Look: F:\pos\dir\file2.txt
ECHO is on.

しかし、その後のすべての呼び出しでは、ガベージ結果が返されます。どんな助けでも大歓迎です。

4

1 に答える 1

1

遅延展開を有効にして!から、ループ内の変数に使用する必要があります。

ファイルの先頭 (通常)

SETLOCAL EnableDelayedExpansion

FORループ内

echo !file!

これは、理由と理由に関する優れたリソースです。

于 2012-12-14T15:08:19.967 に答える