【问题标题】:Shelling out to command on path without showing a new window在不显示新窗口的情况下在路径上执行命令
【发布时间】:2014-07-03 00:12:04
【问题描述】:

我正在尝试将 rake 脚本替换为 FAKE 脚本,但在向另一个应用程序发送时遇到了一些问题。在 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,但随后找不到“捆绑”命令(“异常:进程捆绑启动失败。系统找不到指定的文件”)。我猜如果没有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 的替代品吗?

【问题讨论】:

  • 我猜当 shellExecute 为 false 时,您不需要 exec 并且可以直接调用 jekyll。
  • @JohnPalmer 我认为它仍然需要通过捆绑程序运行,但确切的命令并不重要。在路径上rubyruby -e "puts 'hello'" 中进行炮击可以用作等效情况。
  • CreateNoWindowUseShellExecute 似乎已经相当清楚地涵盖了这一点。您需要将后者设置为 false 才能使前者生效,但是您需要使用完整路径(WorkingDirectory 属性不用于定位可执行文件)。
  • @kvb - 是的,我希望有一种方法可以通过路径环境变量定位程序。我可能只需要手动搜索路径。
  • 所以这不是一个假问题,对吧?它是否适用于任何其他 .NET 程序?

标签: .net f# f#-fake


【解决方案1】:

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

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

我会看看这是否适合 FAKE。

(如果有人有更好的想法,请转换为社区 wiki :))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2017-12-23
    • 2011-04-20
    • 2011-02-25
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多