PowerShell - Start-Process和Cmdline开关

Bud*_*Joe 72 powershell command-line start-process

我可以运行这个罚款:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
start-process $msbuild -wait
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此代码(下面)时,我收到一个错误:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait
Run Code Online (Sandbox Code Playgroud)

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

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

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

Gle*_*lar 116

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

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments 
Run Code Online (Sandbox Code Playgroud)

  • `$ args`作为变量名不起作用,它是保留的.使用`$ arguments`或其他任何东西 (13认同)
  • @dragon788,`get-help start-process` 表示 -ArgumentList 需要 `String[]` (4认同)
  • @joshcomley更新 (2认同)

EBG*_*een 54

使用显式参数,它将是:

$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'
Run Code Online (Sandbox Code Playgroud)

编辑:报价.

  • 使用`-ArgumentList('/ v:q','/ nologo')似乎更可靠. (3认同)
  • Powershell 太冗长了。`git gui &` —— 多么简单(当然是 *nix)!与“start-Process git -ArgumentList gui”相比。我知道我知道,但没有帮助。我最近一直在使用 Powershell,发现了很多好东西;但冗长是一个杀手! (2认同)

Lan*_*abs 7

警告

如果从Powershell创建的cmd.exe窗口运行PowerShell,则第二个实例不再等待作业完成.

cmd>  PowerShell
PS> Start-Process cmd.exe -Wait 
Run Code Online (Sandbox Code Playgroud)

现在,从新的cmd窗口再次运行PowerShell,然后在其中启动第二个cmd窗口:cmd2> PowerShell

PS> Start-Process cmd.exe -Wait
PS>   
Run Code Online (Sandbox Code Playgroud)

PowerShell的第二个实例不再遵循-Wait请求,并且即使您仍在运行,所有后台进程/作业也会返回"已完成"状态!

当我的C#Explorer程序用于打开cmd.exe窗口并从该窗口运行PS时,我发现了这一点,它也忽略了-Wait请求.似乎任何作为cmd.exe的"win32作业"的PowerShell都无法遵守等待请求.

我在Windows 7/x64上使用PowerShell 3.0版遇到了这个问题


mid*_*ace 5

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

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