PowerShell - 启动进程和命令行开关
Posted
技术标签:
【中文标题】PowerShell - 启动进程和命令行开关【英文标题】:PowerShell - Start-Process and Cmdline Switches 【发布时间】: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 链接的博客文章中列出的方法之一。 【参考方案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)。
【讨论】:
以上是关于PowerShell - 启动进程和命令行开关的主要内容,如果未能解决你的问题,请参考以下文章