某所で、環境変数%CMDCMDLINE% が PAUSE するかどうかの判定に使えるという発言を拝見した。なるほど、おもしろい
エクスプローラーの上から CUI プログラムを起動すると、処理終了後、ターミナルが閉じてしまうので、結果を確認しづらいという問題があった。処理終了後、PAUSE を実行すればよいが、そうすると、今度はターミナルから起動した時に余計な待ちが入ってしまう。
そこで、CMDCMDLINE を見て、PAUSE するかどうかを判断すればよいのではないか…ということなのだろう。
@echo CMDCMDLINE=%CMDCMDLINE% @pause
というバッチファイル foo.cmd を作って、いろんな形でキックしてみた。
コマンドプロンプトの CMD.EXE より foo とタイプ
CMDCMDLINE=cmd 続行するには何かキーを押してください . . .
エクスプローラーから foo.cmd をダブルクリック
CMDCMDLINE=C:\Windows\system32\cmd.exe /c ""C:\Users\hymkor\foo.cmd" " 続行するには何かキーを押してください . . .
nyagos から foo とタイプ
CMDCMDLINE=/S /C "call foo.cmd & call set ERRORLEVEL_=%^ERRORLEVEL% & (cd & set) > "C:\Users\hymkor\AppData\Local\Temp\nyagos-22472-3571774775319704776.tmp" " 続行するには何かキーを押してください . . .
えらいものを見られてしまった感 (設計動作なので、これ自体は不具合ではない)
PowerShell から .\foo.cmd とタイプ
CMDCMDLINE=C:\Windows\system32\cmd.exe /c ""C:\Users\hymkor\foo.cmd"" 続行するには何かキーを押してください . . .
EXEファイルでやってみた
foo.cmd というバッチファイルだからうまくいかないのかもしれない。foo.exe というEXEファイルならうまくゆくかもしれない。
package main import ( "os" ) func main(){ println("CMDCMDLINE:",os.Getenv("CMDCMDLINE")) var dummy [100]byte os.Stdin.Read(dummy[:]) }
ところがコレ、CMD.EXE、エクプローラー、PowerShell 問わず
CMDCMDLINE:
としか表示されない。つまり、%CMDCMDLINE% は環境変数ではなく、CMD.EXE 内のシェル変数だったのだ。
うーん、これなら、まだ os.Getppid() で親プロセスを調べた方がマシだ。残念…