84

我可以很好地运行:

$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() 函数吗?

4

5 回答 5

129

你会想把你的论点分成单独的参数

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments 
于 2009-03-16T17:07:28.653 回答
65

使用显式参数,它将是:

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

编辑:引号。

于 2009-03-16T17:10:00.283 回答
8

警告

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

于 2013-01-08T19:04:06.910 回答
5

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

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

于 2011-08-30T06:53:05.833 回答
2

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

于 2009-03-22T06:17:52.347 回答