Command line PowerShell-启动进程和Cmdline开关

Command line PowerShell-启动进程和Cmdline开关,command-line,powershell,start-process,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 是否有一种方法可以

我可以很好地处理这个问题:

$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?我愿意不使用start进程,我使用它的唯一原因是我需要将“command”作为变量

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


我应该改用eval()函数吗

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

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

使用显式参数,它将是:

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

编辑:引号。

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

我发现使用cmd也可以作为一种替代方法,特别是当您需要通过管道从被调用的应用程序输出时(特别是当它没有内置日志记录时,与msbuild不同)

cmd/C“$msbuild$args”>>$outputfile

警告

如果从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版中遇到了这个问题,请参阅以获取启动进程的替代方案。感谢jeffamaphone,这也是一些很好的参考信息。请记住,启动进程是V2中的一项新功能。该帖子中的信息非常好,但在V2中有些信息不再是真正必要的。启动进程本身对V来说是新的2?你能详细说明一下吗?我没有安装V1的机器进行测试。我只是说V1中不存在Start Process commandlet。在V1中,你必须使用Jef链接的博客文章中列出的方法之一。我认为没有它们也可以,但它们肯定可以,所以我会编辑它。它似乎更可靠使用
-ArgumentList('/v:q','/nologo')
Powershell太冗长了。
GitGUI&
——这有多简单(*当然是nix)!与启动进程git-ArgumentList gui相比,。我知道,这没有什么帮助。我最近一直在玩Powershell,有很多不错的东西;但是冗长是个杀手!好吧,如果你愿意的话,它只是那么冗长:启动git-args gui也可以工作。我意识到这仍然比*nix更冗长。重点是t如果你使用制表符补全和别名,那么实际击键的次数会大大减少。我还要补充一点,冗长意味着一个对powershell不太了解的人可以阅读PS命令,更容易理解它在做什么。只是原理上的不同。@HankCa,
sajb{git gui}
$args
因为变量名不起作用,所以它是保留的。使用
$arguments
或其他任何替代方法看起来建议队列已满,但我建议读者理解
-ArgumentList
正在查找字符串,因此另一个答案上的示例使用逗号分隔字符串(从技术上讲是数组)这可能是因为PowerShell可能会展开它,但如果您希望从数组中传入参数列表,最好事先将其“解包”为字符串。@dragon788,
get-help start process
表明-ArgumentList需要
string[]