Windows が演算子「=

Windows が演算子「=

次のバッチファイルがあります:

SET /P FOO=<"foo.txt"

これは、 の内容をfoo.txt変数に読み込もうとする試みでありFOOバッチファイル内の変数にファイルの内容を読み込むにはどうすればよいでしょうか? この方法は以前私にとってはうまく機能しました。

スクリプトを実行すると、次の出力が得られます。

SET /P FOO= 0<"foo.txt"

これは表示エラーだけではなく、値が変数に読み込まれていません。なぜこのようなことが起こるのでしょうか? どうすれば解決できますか?

複数のマシンでこの現象が発生していますが、EOL またはエンコードの問題が原因ではないようです。

答え1

本当に動作しないのですか? 問題を再現しようとしたところ、次のような結果になりました:

D:\>notepad test.bat //i've put SET /P FOO=<"foo.txt" inside it
D:\>echo asdf > foo.txt
D:\>test.bat
D:\>SET /P FOO= 0<"foo.txt"
D:\>echo %FOO%
asdf
D:\>

つまり、追加されます0<が、ファイル内のデータは引き続き変数に適用されます。

答え2

最初の質問に答えると、@grawity指摘した=<は の短縮形に過ぎず、= <0これは完全に正しい構文であり、実際に期待通りに動作します(一度テストすれば正しく)。

したがって、出力に問題はなく、別の問題を調査していたときに、単に誤った方向に進んだだけだったことになります。

この問題は次のようなコードに関連しています。

@ECHO OFF
SETLOCAL
SET TEST=Fail
ECHO Pass>foo.txt

IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO %TEST%
)

これを実行すると、出力は になると予想しました。Passこれは から読み取られるはずだったのですfoo.txtが、出力は でしたFail。これは「マングルされた」構文によるものだと疑いました。

しかし、@Joey指摘したこの行動は、遅延した拡大

上記のコードを機能させるには、次のように書き直す必要があります。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET TEST=Fail
ECHO Pass>foo.txt

IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO !TEST!
)

関連情報