【发布时间】:2014-07-03 00:12:04
【问题描述】:
我正在尝试将 rake 脚本替换为 FAKE 脚本,但在向另一个应用程序发送时遇到了一些问题。在 rake 中,我会执行类似 sh 'bundle exec jekyll "#{outputDir}"' 的操作,其中 bundle 在我的 PATH 上,但在 .NET/FAKE 中,我无法在不弹出新窗口的情况下运行命令。
我的具体用例是 FAKE 及其 ProcessHelper,但我认为这个问题可以推广到 ProcessStartInfo 的任何使用。
以下命令运行成功(info是ProcessStartInfo),但弹出一个新窗口:
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 我认为它仍然需要通过捆绑程序运行,但确切的命令并不重要。在路径上
ruby的ruby -e "puts 'hello'"中进行炮击可以用作等效情况。 -
CreateNoWindow 和 UseShellExecute 似乎已经相当清楚地涵盖了这一点。您需要将后者设置为 false 才能使前者生效,但是您需要使用完整路径(WorkingDirectory 属性不用于定位可执行文件)。
-
@kvb - 是的,我希望有一种方法可以通过路径环境变量定位程序。我可能只需要手动搜索路径。
-
所以这不是一个假问题,对吧?它是否适用于任何其他 .NET 程序?