PowerShell スクリプトを実行してさまざまなパラメーターを渡す優れた MSBuild タスクを知っている人はいますか?
B# .NET ブログ: Invoking PowerShell scripts from MSBuildを見つけることができましたが、もう少し洗練されたものを期待しています。
何も見つからない場合は、もちろん先に進み、そのブログ投稿をスターターとして使用して自分自身を磨きます.
PowerShell スクリプトを実行してさまざまなパラメーターを渡す優れた MSBuild タスクを知っている人はいますか?
B# .NET ブログ: Invoking PowerShell scripts from MSBuildを見つけることができましたが、もう少し洗練されたものを期待しています。
何も見つからない場合は、もちろん先に進み、そのブログ投稿をスターターとして使用して自分自身を磨きます.
3.5 にはhttp://powershellmsbuild.codeplex.com/を使用できます。NuGet package restore を介して活用できる NuGet パッケージがあればいいのですが。
4.0 には、コード ギャラリーで入手できるWindows Powershell タスク ファクトリがあり、 MSBuild 拡張パック (最上位のタスク ライブラリの 1 つ - 400 以上のタスク & MSBuild 内で推奨) に組み込まれてい
ます (ヘルプ ファイルは、のダウンロード セクションからダウンロードしてください)。この例のリリースを見てみましょう)。PowerShellTaskFactory
PowerShell ベースのビルド環境であるPsakeも参照してください。
私が投稿した重複した質問と回答は、投票が終了したときの後世のためにここにあります。主な違いは、この質問はOOTBに制限されており、私の自己回答はその制限内にとどまっていることです。
cmd.exe
Powershell には、任意のコマンドでそれをトリガーし、 PowerShell ではない呼び出し元 (例: TeamCityなど) と正しく相互運用する方法で解析エラーと実行エラーをバブルアップする簡単な方法がないようです。
私の質問は簡単です。OOTB MSBuild v4 と PowerShell v3 を使用する私にとって最善の方法は何ですか (提案を受け付けています。適切に運用可能な MSBuild タスクを除外することはできませんが、「簡単です。PowerShell タスク ファクトリのサンプルを使用して、それを微調整するか、メンテナー/親になる") コマンド (小さなスクリプト セグメント、または (最も一般的には).ps1
スクリプトの呼び出しのいずれか) を実行します。
私はそれが次のような普通のものであるべきだと考えています:
<Exec
IgnoreStandardErrorWarningFormat="true"
Command="PowerShell "$(ThingToDo)"" />
残念ながらうまくいきません:-
ThingToDo
解析に失敗すると、黙って失敗しますThingToDo
存在しないスクリプト呼び出しの場合、失敗しますERRORLEVEL
ベースの結果を伝播したい場合.cmd
は、毛むくじゃらになります"
に引用符を埋め込みたい場合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 で動作することです。
私はコートを手に入れます。
ちょっとした楽しみで、私はこれを機能させるためのかなりきれいな方法を思いつくことができました:
<?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 -& 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>
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