PowerShell - Start-Process和Cmdline开关

时间:2009-03-16 16:46:16

标签: command-line powershell start-process

我可以正常运行:

$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

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

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

我应该使用某种eval()类型的函数吗?

5 个答案:

答案 0 :(得分:108)

您将要将参数分隔为单独的参数

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

答案 1 :(得分:50)

使用显式参数,它将是:

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

编辑:引用。

答案 2 :(得分:6)

警告

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

答案 3 :(得分:5)

我发现使用cmd可以很好地替代,特别是当你需要管理被调用应用程序的输出时(特别是当它没有内置日志记录时,与msbuild不同)

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

答案 4 :(得分:1)

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