5

PowerShell スクリプトを実行してさまざまなパラメーターを渡す優れた MSBuild タスクを知っている人はいますか?

B# .NET ブログ: Invoking PowerShell scripts from MSBuildを見つけることができましたが、もう少し洗練されたものを期待しています。

何も見つからない場合は、もちろん先に進み、そのブログ投稿をスターターとして使用して自分自身を磨きます.

4

4 に答える 4

7

PowerShell ベースのビルド環境であるPsakeも参照してください。

于 2008-09-17T05:24:58.203 に答える
4

私が投稿した重複した質問と回答は、投票が終了したときの後世のためにここにあります。主な違いは、この質問はOOTBに制限されており、私の自己回答はその制限内にとどまっていることです。

質問

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できるものはありますか?

答え

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

<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)" />

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

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

于 2012-10-10T10:48:17.090 に答える
3

ちょっとした楽しみで、私はこれを機能させるためのかなりきれいな方法を思いつくことができました:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- #1 Place this line at the top of any msbuild script (ie, csproj, etc) -->
  <PropertyGroup><PowerShell># 2>nul || type %~df0|find /v "setlocal"|find /v "errorlevel"|powershell.exe -noninteractive -&amp; exit %errorlevel% || #</PowerShell></PropertyGroup>

  <!-- #2 in any target you want to run a script -->
  <Target Name="default" >

    <PropertyGroup> <!-- #3 prefix your powershell script with the $(PowerShell) variable, then code as normal! -->
      <myscript>$(PowerShell)
      #
      # powershell script can do whatever you need.
      #
      dir ".\*.cs" -recurse |% {
        write-host Examining file named:  $_.FullName
        # do other stuff here...
      } 
      $answer = 2+5
      write-host Answer is $answer !
      </myscript>
    </PropertyGroup>

    <!-- #4 and execute the script like this -->
    <Exec Command="$(myscript)" EchoOff="true" /> 
  </Target>
</Project>

ノート:

  • 標準の Exec Task 機能は引き続き使用できます。(参照: https://msdn.microsoft.com/en-us/library/x8zx72cd.aspx )
  • PowerShell スクリプトで < > または & 文字を使用する必要がある場合は、コンテンツを CDATA ラッパーに配置するだけです。

    <script2><![CDATA[  $(PowerShell)
      # your powershell code goes here!
      write-host "<<Hi mom!>>"
    ]]></script2>
    
  • msbuild スクリプトにアイテムを返したい場合は、それらを取得できます。

    <script3>$(PowerShell)
      # your powershell code goes here!
      (dir "*.cs" -recurse).FullName
    </script3>
    
    <Exec Command="$(script3)" EchoOff="true" ConsoleToMSBuild="true"> 
        <Output TaskParameter="ConsoleOutput" PropertyName="items" />
    </Exec>
    <Touch Files="$(items)" /> 
    

見る!次に、これらのアイテムを別の msbuild タスクで使用できます:D

于 2016-12-09T01:36:37.073 に答える