コードは、
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
echo %VAR%
)
上記の Windows .bat ファイル コード セグメントは何を表示しますか? なんで?(つまり、最初に考えたように動作しないのはなぜですか)?
コードは、
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
echo %VAR%
)
上記の Windows .bat ファイル コード セグメントは何を表示しますか? なんで?(つまり、最初に考えたように動作しないのはなぜですか)?
明らかに、ループ内で env 変数をリセットしたことを考えると、出力は「後」になると思うでしょう。
しかし、出力は実際には「前」になります。その理由は、コマンドが実行されるときではなく、コマンドが読み取られるときに、インタープリターによって .bat ファイルで変数置換が行われるためです。したがって、複合ステートメントの場合、if ステートメントが最初に検出されたときに、本体の変数が評価されます。
遅延環境変数展開を使用してこれを機能させることができます (有効にする必要があります)。有効になっている場合は、次のことができます。
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
echo !VAR!
)
cmd.exe の起動時に /v オプションを使用して、遅延環境変数展開を有効にすることができます。
[裏話 -- 私たちの多くは今でもレガシー .bat ファイルを使用して、make 手順などを実行しています。明らかに、より優れたスクリプト ツールがありますが、それらを使用するオプションが常にあるとは限りません。私はしばらく前にこの問題に遭遇し、最近、同じことで髪を引っ張っていた他の2人を見つけました. したがって、インタプリタがどのように変数置換を行うかを理解しておくと役に立ちます]。
の置換%VAR%
は、コマンドの実行前に行われます。いくつかのコマンドが複数の行にまたがっていますが、それらを括弧でグループ化する(...)
と、cmd.exe パーサーはすべてを 1 つのコマンドとして読み取ります。したがって、何が実行されるかは、インタープリターには次のように見えます。
set VAR=before
if "before" == "before" (
set VAR=after;
echo before
)
これは、単純なこと以上のことをしようとすると、バッチ ファイルの処理がかなり苦痛になる多くのことの 1 つです。