【问题标题】:PowerShell - Start-Process and Cmdline SwitchesPowerShell - 启动进程和命令行开关
【发布时间】:2010-10-13 16:00:45
【问题描述】:

我可以正常运行:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
start-process $msbuild -wait

但是当我运行这段代码(如下)时,我得到一个错误:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait

有没有办法可以使用启动过程将参数传递给 MSBuild?我愿意不使用启动进程,我使用它的唯一原因是我需要将“命令”作为变量。

当我有
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo
单独一行,如何在 Powershell 中处理?

我应该改用某种 eval() 函数吗?

【问题讨论】:

  • 请参阅 blogs.msdn.com/powershell/archive/2007/01/16/… 了解 start-process 的替代方案。
  • 感谢 jeffamaphone,这也是一些很好的参考信息。
  • 请记住,Start-Process 是 V2 中的一项新功能。该帖子中的信息非常好,但其中一些在 V2 中不再需要。
  • Start-Process 本身对 V2 来说是新的吗?你能详细说明一下吗?我没有安装 V1 的机器进行测试。
  • 我的意思是 Start-Process commandlet 在 V1 中不存在。在 V1 中,您必须使用 Jef 链接的博客文章中列出的方法之一。

标签: command-line powershell start-process


【解决方案1】:

我发现使用 cmd 作为一种替代方法效果很好,尤其是当您需要从被调用应用程序中传输输出时(尤其是当它没有内置日志记录时,与 msbuild 不同)

cmd /C "$msbuild $args" >> $outputfile

【讨论】:

    【解决方案2】:

    使用显式参数,它将是:

    $msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
    start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'
    

    编辑:引号。

    【讨论】:

    • 我认为没有它们也可以,但有它们肯定可以,所以我会编辑它
    • -ArgumentList ('/v:q','/nologo')好像更靠谱
    • Powershell 太冗长了。 git gui & -- 多么简单(当然是*nix)!与start-Process git -ArgumentList gui 相比。我知道我知道,没有帮助。我最近一直在玩 Powershell 并且有很多不错的东西;但冗长是一个杀手!
    • 好吧,如果你想要的话,它只是那么冗长:start git -args gui 也可以。我意识到这仍然比 *nix 更冗长。关键是,如果您使用制表符补全和别名,则实际击键次数会大大减少。我还要补充一点,冗长意味着根本不了解 powershell 的人可以阅读 PS 命令并更容易准确地理解它在做什么。只是理念上的不同。
    • @HankCa, sajb { git gui }
    【解决方案3】:

    警告

    如果您从 Powershell 创建的 cmd.exe 窗口运行 PowerShell,则第二个实例不再等待作业完成。

    cmd>  PowerShell
    PS> Start-Process cmd.exe -Wait 
    

    现在在新的 cmd 窗口中,再次运行 PowerShell 并在其中启动第二个 cmd 窗口: cmd2> PowerShell

    PS> Start-Process cmd.exe -Wait
    PS>   
    

    PowerShell 的第二个实例不再支持 -Wait 请求,所有后台进程/作业都返回“已完成”状态,即使它们仍在运行!

    当我的 C# Explorer 程序用于打开 cmd.exe 窗口并从该窗口运行 PS 时,我发现了这一点,它也忽略了 -Wait 请求。 似乎任何属于 cmd.exe 的“win32 作业”的 PowerShell 都无法满足等待请求。

    我在 Windows 7/x64 上使用 PowerShell 3.0 版遇到了这个问题

    【讨论】:

      【解决方案4】:

      你会想要将你的参数分成单独的参数

      $msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
      $arguments = "/v:q /nologo"
      start-process $msbuild $arguments 
      

      【讨论】:

      • $args 作为变量名不起作用,它是保留的。改用$arguments 或其他任何东西
      • 看起来建议队列已满,但我建议读者理解-ArgumentList 正在寻找字符串,因此以逗号分隔的字符串(技术上是数组)的另一个答案的示例可能会起作用,因为PowerShell 可能如何展开它,但如果您希望从数组中传入参数列表,最好事先将其“解包”成字符串。
      • @dragon788, get-help start-process 表示 -ArgumentList 期望 String[]
      【解决方案5】:

      除非 OP 使用 PowerShell 社区扩展,它确实提供了 Start-Process cmdlet 以及其他一些。如果是这种情况,那么 Glennular 的解决方案会奏效,因为它与 pscx\start-process 的位置参数匹配:-path (位置 1) -arguments (位置 2)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 2019-06-23
        • 2018-06-11
        • 1970-01-01
        • 2018-04-11
        • 1970-01-01
        相关资源
        最近更新 更多