2

PowerShell v3.0 を使用して新しい cmd.exe プロセスを開始します。次に、Visual Studio コマンド プロンプトをロードしてビルドを実行します。

Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuildInVsCommandPrompt -WindowStyle $windowStyle -Wait

これは機能し、新しいコマンド プロンプト ウィンドウが開き、ビルドが行われていることがわかります。ビルドが完了すると、コマンド プロンプト ウィンドウが閉じます。ビルドが成功したかどうかを調べるために、コマンド プロンプト ウィンドウに書き込まれたテキストを取得して変数に格納できるようにしたいと考えています。これを使ってみましたが、うまくいきません。$buildOutput 変数が空です:

Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuildInVsCommandPrompt -WindowStyle $windowStyle -Wait -OutVariable buildOutput
Write-Host "Build output = $buildOutput"

cmd.exe プロセスはテキストを返さないため、これは理にかなっています。独自のウィンドウに書き込むだけです。元の PowerShell スクリプトが使用する変数にそのテキストを格納できる方法はありますか? MsBuild にパラメーターを指定してビルド ログをファイルに書き込むことができることはわかっていますが、ログ ファイルへの書き込みと後で削除する必要がないソリューションを探しています。

任意の提案をいただければ幸いです。ありがとう!

<# 編集 #>

これまでのすべての応答に感謝します! よくある提案は、cmd.exe を使用せずに MsBuild.exe を直接呼び出すことです。cmd.exe を使用する必要があるのは、MsBuild.exe から直接呼び出すと一部のプロジェクトが正常にビルドされないためです (XNA プロジェクトなど)。代わりに、Visual Studio のコマンド プロンプトから MsBuild.exe を呼び出す必要があります。これにより、必要な環境変数がすべて設定されると思います。VS コマンド プロンプトを直接呼び出すこともできると思いますが、cmd.exe を呼び出すのと同じ問題が発生します。VS コマンド プロンプトが見つからない場合は、フォールバックして MsBuild.exe を直接呼び出すので、これらの回答は引き続き高く評価されます。

4

4 に答える 4

14

コンソール プログラムの出力は、次の方法でいつでも取得できます。

$output = [string](nuget.exe)

ここでは nuget を使用しました ($output には使用可能なコマンドの一覧が含まれます) が、もちろん適切な引数を指定して msbuild.exe を使用することもできます。

于 2013-02-23T14:52:55.603 に答える
3

質問に対する最初のコメントからの提案を使用して問題を解決しました。これは、ビルド出力をログ ファイルに書き込み、それを消費してから削除するというものでした。これにより、必要に応じてビルドの進行状況を示す cmd ウィンドウをユーザーに表示し、ビルドが完了したらビルド出力を調べることができます。また、別のプロセスでビルドを実行することもできるため、実行を続行する前にスクリプトがビルドの完了を待たないようにする場合は、PassThru を使用できます。

Invoke-MsBuild powershell モジュールを作成して、MsBuild を使用したビルドを簡単にし、追加機能用の多くのパラメーターを提供しました (ビルドが成功または失敗した場合に戻り、ビルド ウィンドウを表示/非表示にすることができ、ビルドが完了するまで待機する/待機しないことができます。失敗したビルドなどのビルド ログを自動的に表示できます)。スクリプトは私のブログから表示およびダウンロードできます。

于 2013-04-10T17:46:24.800 に答える
2
$process = New-Object System.Diagnostics.Process;
$process.StartInfo.UseShellExecute = $false;
$process.StartInfo.RedirectStandardOutput = $true;
$process.StartInfo.FileName = "cmd.exe";
$process.StartInfo.Arguments = $cmdArgumentsToRunMsBuildInVsCommandPrompt;
$process.Start();
$outputStream = $process.StandardOutput;
$outputStream.ReadToEnd();

リダイレクトすることもできますStandardError

于 2013-02-24T12:15:48.917 に答える
0

編集:@David Brabantの回答を使用してしまいました

この問題に遭遇し、エコー関数を作成しました

function echo()
{
    $input
}

私にこれをさせてくれました

$output = &"cmd.exe" $args | echo
于 2014-03-14T01:59:04.220 に答える