読者です 読者をやめる 読者になる 読者になる

Groovyからexecute()したプロセスで環境変数がうまく取れない

C# Groovy Windows
  • 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
  • あれ?もしかしてComSpecCOMSPECって全部大文字に変わってるからかな?
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便利だなぁ。