web-dev-qa-db-ja.com

cmd.exeサブシェルで環境変数の内容を設定して印刷しますか?

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行に出力できますか?

6
sdbbs

なぜこれが起こるのですか?

%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)実行:コマンドが実行されます

5
DavidPostill

環境変数を設定して、cmd.exeサブシェルで1行にエコーで出力するにはどうすればよいですか?

必要な 遅延展開 をcmdサブシェルで有効にするには、_ cmd.exe/V:ONスイッチを使用し、!感嘆符を使用する必要があります%パーセント記号の代わり。

> cmd /V:ON /C "SET OPERATION=NEW&echo [!OPERATION!]"
[NEW]

リマインダーだけ
元のセットの末尾のスペースは可変コンテンツの一部になります:

> cmd /V:ON /C "SET OPERATION=NEW &echo [!OPERATION!]"
[NEW ]
7
LotPings