1

重複の可能性:
適切な PowerShell MSBuild タスクはありますか?

cmd.exePowershell には、任意のコマンドでそれをトリガーし、 PowerShell ではない呼び出し元 (例: TeamCityなど) と正しく相互運用する方法で解析エラーと実行エラーをバブルアップする簡単な方法がないようです。

私の質問は簡単です。OOTB MSBuild v4 と PowerShell v3 で私にとって最善の方法は何ですか (提案を受け付けています - 適切に運用可能な MSBuild タスクを除外することはありませんが、「簡単です - PowerShell タスク ファクトリのサンプルを取得して、それを微調整するか、メンテナー/親になる") コマンド (小さなスクリプト セグメント、または (最も一般的には).ps1スクリプトの呼び出しのいずれか) を実行します。

私はそれが次のような普通のものであるべきだと考えています:

<Exec 
  IgnoreStandardErrorWarningFormat="true"
  Command="PowerShell &quot;$(ThingToDo)&quot;" />

残念ながらうまくいきません:-

  1. ThingToDo解析に失敗すると、黙って失敗します
  2. ThingToDo存在しないスクリプト呼び出しの場合、失敗します
  3. ERRORLEVELベースの結果を伝播したい場合.cmdは、毛むくじゃらになります
  4. "に引用符を埋め込みたい場合ThingToDo、機能しません

では、MSBuild から PowerShell を実行する防弾方法とはどのようなものでしょうか? すべてを正常にするためにPsGetできるものはありますか?

4

2 に答える 2

2

次の例を使用できます。

<InvokeScript Condition="..."
              PowerShellProperties="..."
              ScriptFile="[PATH TO PS1 FILE]"
              Function="[FUNCTION TO CALL IN PS1]"
              Parameters="..."
              RequiredOutputParams="...">
  <!-- You can catch the output in an Item -->
  <Output TaskParameter="OutputResults"
          ItemName="Output" />
</InvokeScript>

これは MSBuild で使用できます。

于 2012-10-10T07:12:34.230 に答える
1

うーん、もっと良い方法が見つかるまで、このような長々としたものを使用できます:-

<PropertyGroup>
  <__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand>
  <__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin>
  <__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd>
  <_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</PsCmdStart>
  <_PsCmdEnd>$(__BlockEnd)"</PsCmdEnd>
</PropertyGroup>

そして、あなたがする必要がある「すべて」は次のとおりです。

<Exec 
  IgnoreStandardErrorWarningFormat="true"
  Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" />

これの唯一の償還機能 (考えられるすべてのエラー タイプをトラップすること以外) は、どの PowerShell バージョンおよびどの MSBuild バージョンでも OOTB で動作することです。

私はコートを手に入れます。

于 2012-07-25T11:19:29.043 に答える