在没有显示新窗口的情况下脱离命令在路径上

时间:2014-07-03 00:12:04

标签: .net f# f#-fake

我正在尝试使用FAKE替换rake脚本,但是遇到了一些问题,导致另一个应用程序出现问题。在rake中我会做sh 'bundle exec jekyll "#{outputDir}"'之类的事情bundle PATH,但是在.NET / FAKE中我无法在没有弹出新窗口的情况下运行命令。

我的具体用例是针对FAKE及其ProcessHelper,但我认为这个问题可以推广到ProcessStartInfo的任何使用。

以下命令成功运行(infoProcessStartInfo),但会弹出一个新窗口:

ExecProcess (fun info -> 
                   info.UseShellExecute <- true
                   info.CreateNoWindow <- true //doesn't apply when UseShellExecute is true
                   info.FileName <- "bundle"
                   info.WorkingDirectory <- workingDir
                   info.Arguments <- "exec jekyll \"" + outputDir + "")
            (TimeSpan.FromMinutes 5.)

要重用当前窗口,我将UseShellExecute设置为false,但是找不到“bundle”命令(“例外:进程包启动失败。系统找不到指定的文件“)。我猜测没有UseShellExecute PATH环境未设置,因此我尝试调用setEnvironmentVariables

let pathEnv = Environment.GetEnvironmentVariable("PATH")
ExecProcess (fun info -> 
                   info.UseShellExecute <- false
                   info.FileName <- "bundle"
                   info.WorkingDirectory <- workingDir
                   info.Arguments <- "exec jekyll \"" + outputDir + "")
                   setEnvironmentVariables info [("PATH", pathEnv)])
            (TimeSpan.FromMinutes 5.)

有没有办法配置ProcessStartInfo来做我想要的事情?或者我应该使用ProcessStartInfo的替代方案吗?

1 个答案:

答案 0 :(得分:2)

我找不到办法,所以最终手动搜索路径。

let findExecutableInPath (exe:String) =
    Environment.GetEnvironmentVariable("PATH").Split([| Path.PathSeparator |])
    |> Seq.append ["."]
    |> Seq.map (fun p -> p @@ exe)
    |> Seq.tryFind (File.Exists)

我会看看这是否适合用于FAKE。

(如果有人有更好的想法,转换为社区维基)))