標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

CMD.EXE の変数 CMDCMDLINE で CUI プログラムの起動のさせ方が分かるのではないか?(結論:わからん)

某所で、環境変数%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() で親プロセスを調べた方がマシだ。残念…