web-dev-qa-db-ja.com

PowerShell-開始プロセスおよびCmdlineスイッチ

私はこれをうまく実行できます:

$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に渡す方法はありますか?私はstart-processを使用しないことを受け入れています。それを使用した唯一の理由は、変数として「コマンド」が必要だったからです。

私が持っているとき
C:\ WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe/v:q/nologo
1行で、Powershellでどのように処理されますか?

代わりに何らかのeval()種類の関数を使用する必要がありますか?

70
BuddyJoe

引数を個別のパラメーターに分離する必要があります

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

明示的なパラメーターを使用すると、次のようになります。

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

編集:引用。

52
EBGreen

警告

PowerShellによって作成されたcmd.exeウィンドウからPowerShellを実行すると、2番目のインスタンスはジョブの完了を待機しなくなります。

cmd>  PowerShell
PS> Start-Process cmd.exe -Wait 

次に、新しいcmdウィンドウからPowerShellを再度実行し、その中で2番目のcmdウィンドウを開始します。cmd2> PowerShell

PS> Start-Process cmd.exe -Wait
PS>   

PowerShellの2番目のインスタンスは-Waitリクエストを受け付けなくなり、すべてのバックグラウンドプロセス/ジョブはまだ実行中であっても「完了」ステータスを返します!

これは、C#Explorerプログラムを使用してcmd.exeウィンドウを開き、PSをそのウィンドウから実行したときに発見されました。-Wait要求も無視します。 cmd.exeの 'win32ジョブ'であるPowerShellは、待機要求を受け入れられないようです。

Windows 7/x64上のPowerShellバージョン3.0でこれに遭遇しました

6
LanDenLabs

呼び出されたアプリケーションから出力をパイプする必要がある場合(特にmsbuildとは異なり、ロギングが組み込まれていない場合)、特にcmdを使用すると代替としてうまく機能することがわかりました

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

5
midspace

OPがPowerShell Community Extensionsを使用していない限り、Start-Processコマンドレットと他の多くのコマンドレットが提供されます。この場合、Glennularのソリューションは、pscx\start-processの位置パラメーターに一致するため、扱いになります:-path(位置1)-引数(位置2)。

1
Keith Hill