私はこれをうまく実行できます:
$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()種類の関数を使用する必要がありますか?
引数を個別のパラメーターに分離する必要があります
$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'
編集:引用。
警告
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でこれに遭遇しました
呼び出されたアプリケーションから出力をパイプする必要がある場合(特にmsbuildとは異なり、ロギングが組み込まれていない場合)、特にcmdを使用すると代替としてうまく機能することがわかりました
cmd /C "$msbuild $args" >> $outputfile
OPがPowerShell Community Extensionsを使用していない限り、Start-Processコマンドレットと他の多くのコマンドレットが提供されます。この場合、Glennularのソリューションは、pscx\start-processの位置パラメーターに一致するため、扱いになります:-path(位置1)-引数(位置2)。