cmd.exe
の新しい「サブ」インスタンスを開始し、その中に新しい環境変数を設定して、適切な値が設定されているかどうかを確認するこの例を考えます(これはWindows 10のcmd.exe
にあります)。
>cmd /c "SET OPERATION=NEW & SET O"
OneDrive=C:\Users\user\OneDrive
OPERATION=NEW
OS=Windows_NT
したがって、 https://superuser.com/a/776506/688965 に記載されているように、SET O
を実行すると、「「O」で始まるすべての変数が表示されます "、そして実際、環境変数OPERATION
が存在し、その値がNEW
であることを示しています。ここまでは順調ですね。
ただし、代わりに環境値を出力しようとすると、展開されません展開されません。
>cmd /c "SET OPERATION=NEW & echo %OPERATION%"
%OPERATION%
...しかし、other環境変数を展開しようとすると、動作しますか?!:
>cmd /c "SET OPERATION=NEW & echo %OS%"
Windows_NT
なぜこれが起こるのですか?どのようにして環境変数を設定し、echo
を使用して、cmd.exe
サブシェルで1行に出力できますか?
%OPERATION%
は、変数が設定される前に(フェーズ1)展開されます(フェーズ7)。
詳細については Windowsコマンドインタープリター(CMD.EXE)解析スクリプトの方法は? を参照してください。
バッチファイルのコード行の処理には、複数のフェーズが含まれます。
以下は、さまざまなフェーズの概要です。
フェーズ0)読み取り行:
フェーズ1)拡張率:
フェーズ1.5)削除:すべての復帰(0x0D)文字を削除します
フェーズ2)特殊文字の処理、トークン化、およびキャッシュされたコマンドブロックの作成:これは、引用符、特殊文字、トークン区切り文字、キャレットエスケープなどの影響を受ける複雑なプロセスです。
フェーズ3)解析されたコマンドをエコーします。コマンドブロックが@で始まらず、ECHOが前のステップの開始時にオンであった場合のみ。
フェーズ4)FOR%X変数の展開:FORコマンドがアクティブで、DOの後のコマンドが処理されている場合のみ。
フェーズ5)遅延拡張:遅延拡張が有効な場合のみ
フェーズ5.3)パイプ処理:コマンドがパイプのどちらかの側にある場合のみ
フェーズ5.5)リダイレクトの実行:
フェーズ6)CALL処理/キャレットダブリング:コマンドトークンがCALLの場合のみ
フェーズ7)実行:コマンドが実行されます