Groovyからexecute()したプロセスで環境変数がうまく取れない
- C#で書いたexeがあって、内部で
Environment.GetEnvironmentVariable("ComSpec");
してcmd.exeのフルパスを取っているのですが、何故かGroovyからexecute()
した時だけ値が空白になります。
検証コード
groovy> println "cmd /c set".execute([], new File(".")).text COMSPEC=C:\Windows\system32\cmd.exe PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.JS;.WS;.MSC PROMPT=$P$G SystemRoot=C:\Windows
- あれ?もしかして
ComSpec
がCOMSPEC
って全部大文字に変わってるからかな?
C:\>set ALLUSERSPROFILE=C:\ProgramData ChocolateyInstall=C:\ProgramData\chocolatey CommonProgramFiles=C:\Program Files\Common Files ComSpec=C:\Windows\system32\cmd.exe 以下略
- うーんそうかも。
execute()
に環境変数を渡せそうなので渡してみる
- ここを参考にやってみる。
[http://npnl.hatenablog.jp/entry/20110325/1301006575#Process_execute_String_ary_envp_File_dir:embed:cite]
groovy> def env = System.getenv() groovy> def envList = env.collect { "$it.key=$it.value" } groovy> println "cmd /c set".execute(envList, new File(".")).text ALLUSERSPROFILE=C:\ProgramData ChocolateyInstall=C:\ProgramData\chocolatey CLASS=groovy.ui.Console COMMAND_COM="C:\Windows\system32\cmd.exe" CommonProgramFiles=C:\Program Files\Common Files ComSpec=C:\Windows\system32\cmd.exe 以下略
- このやり方でC#側を呼んだら
ComSpec
の値がちゃんが取れました。 - この件と関係ないけど、Groovyの
collect
便利だなぁ。