PowerShell-启动过程和Cmdline开关


79

我可以运行得很好:

$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/…
i_am_jorf

感谢jeffamaphone,这也是一些很好的参考信息。
BuddyJoe

1
请记住,启动过程是V2中的新功能。该帖子中的信息非常好,但是在V2中确实不再需要其中的一些信息。
EBGreen

Start-Process本身对V2是新的吗?你能详细说明一下吗?我没有安装任何要测试V1的计算机。
BuddyJoe

1
我只是说V1中不存在Start-Process命令行开关。在V1中,您必须使用Jef链接的博客文章中列出的方法之一。
EBGreen

Answers:


124

您将需要将参数分成单独的参数

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

15
$args因为变量名不起作用,所以保留了它。使用$arguments或其他方式代替
joshcomley 2012年

1
看起来建议队列已满,但是我建议读者理解这-ArgumentList是在寻找字符串,因此,另一个答案中的示例使用逗号分隔的字符串(从技术上讲是一个数组)可能会起作用,因为PowerShell可能会展开它,但是如果为了从数组中传递参数列表,最好事先将其“解包”为字符串。
dragon788 '17

3
@ dragon788,get-help start-process表示-ArgumentList预期String[]
asynchronos

60

使用显式参数,它将是:

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

编辑:引号。


我认为没有他们是可以的,但是他们绝对可以,所以我将对其进行编辑
EBGreen

4
使用起来似乎更可靠-ArgumentList ('/v:q','/nologo')
Peter Taylor

1
Powershell太冗长了。 git gui &-这有多简单(当然是* nix)!相比start-Process git -ArgumentList gui。我知道我知道,没有帮助。最近我一直在和Powershell玩,有很多不错的东西。但是冗长是杀手!
HankCa's

1
好吧,如果您希望它只是冗长的话:start git -args gui也可以。我意识到这仍然比* nix更详细。关键是,如果您使用制表符补全和别名,那么实际击键的次数将大大减少。我还要补充一点,冗长的意思是一个完全不了解Powershell的人可以阅读PS命令并更容易准确地了解它在做什么。只是哲学上的不同。
EBGreen

@HankCa,sajb { git gui }
asynchronos

7

警告

如果从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中遇到了这个问题


5

我发现使用cmd可以很好地替代,尤其是当您需要通过管道传输来自被调用应用程序的输出时(特别是在没有内置日志记录的情况下,与msbuild不同)

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


2

除非OP使用的是PowerShell Community Extensions,否则它确实提供了Start-Process cmdlet以及许多其他功能。如果是这种情况,那么Glennular的解决方案可以解决问题,因为它与pscx \ start-process的位置参数匹配:-path(位置1)-arguments(位置2)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.