0

teamcity と TFPT の TFS Powershell コマンドレットを統合しながら、psake ビルドを実行するためのバッチ ファイルを作成しています。

@ECHO OFF

SET COMMAND_TO_EXECUTE=
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% "& {
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% Import-Module '..\tools\psake\psake.psm1';
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% try
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% {
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% invoke-psake -framework '4.0' -taskList %1 -properties @{config='%2'}
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% };
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% catch
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% {
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% . ..\tools\psake\teamcity.ps1; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% if(![string]::IsNullOrEmpty($env:TEAMCITY_VERSION))
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% {TeamCity-ReportBuildStatus -status 'FAILURE' -text $_}
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% else 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% {Write-Host ERROR: $_ -ForegroundColor RED}; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% exit $Error.Count;
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% };
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% finally {remove-module psake};
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% };"

echo Build command is %COMMAND_TO_EXECUTE%

IF %PROCESSOR_ARCHITECTURE% == x86 (
powershell -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1" -Version "2.0" -NoProfile -ExecutionPolicy unrestricted -Command %COMMAND_TO_EXECUTE%
) ELSE C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1" -Version "2.0" -NoProfile -ExecutionPolicy unrestricted -Command %COMMAND_TO_EXECUTE%

Powershell がゼロ以外の終了コードで終了しないためにエラーが発生した場合、TeamCity でビルドが失敗しないという問題がありました。上記のスクリプトで私がやろうとしているのは、Invoke-Psake コマンドから終了エラーをキャッチし、エラーを teamcity に報告し、発生したエラーの数に等しいゼロ以外のコードでプロセスを終了することです。私が知る限り、スクリプトは問題ないようです。結果のコマンドを単独で実行すると、うまくいくようです。ただし、powershell 実行可能ファイルの -Command 引数に割り当てられたコマンドを使用して上記のバッチ ファイルの一部として実行すると、次のエラーで失敗します。

単項演算子 '-' の後に式がありません

コマンドを単独で実行するとうまくいくように見えるので、特にそうすべき理由がわかりません。誰でも問題に光を当てることができますか? おそらくどこかの構文エラーですが、わかりません。

4

1 に答える 1

0

うーん、エスケープキャラクターで魔法をかける必要があると思います。cmdからpowershellを呼び出すと、次のようにフォーメーションを維持しようとします-

"powershell.exe -command'&{。C:\ Temp \ Example.ps1 -param1 hello}'"

複雑なのは、構築しようとしている複数行のcmd変数にあります。変数が展開されるたびに、適用するエスケープシーケンスがすべて削除されます。私はあなたのために少し混乱しましたが、それから考えました....なぜあなたはあなたのスクリプトブロックを入れて.ps1スクリプトを作成して、厄介なエスケープなどを保存しないのですか?

したがって、Invoke-Build.ps1は--Param($ TaskList、$ Config)Import-Module .. \ tools \ psake \ psake.psm1 try {invoke-psake -framework 4.0 -taskList $ TaskList -properties @ {config = $ Config} }catch{。.. \ tools \ psake \ teamcity.ps1; if(![string] :: IsNullOrEmpty($ env:TEAMCITY_VERSION)){TeamCity-ReportBuildStatus -status FAILURE -text $ _} else {書き込み-ホストエラー:$ _ -ForegroundColor RED} exit$Error.Count}最後に{削除-モジュールpsake}

次に、cmdからスクリプトをドットソースすることができます......

@echo OFF

SET COMMAND_TO_EXECUTE = Invoke-Build.ps1

echoビルドコマンドは「%COMMAND_TO_EXECUTE%」です

IF%PROCESSOR_ARCHITECTURE%== x86(powershell -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1" -Version "2.0" -NoProfile -ExecutionPolicy unrestricted -Command "&{。%COMMAND_TO_EXECUTE%-TaskList -Config}")ELSE(C:\ Windows \ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell.exe -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1" -Version "2.0" -NoProfile -ExecutionPolicy unrestricted -Command "&{。%COMMAND_TO_EXECUTE%-TaskList -Config}"

于 2010-11-08T21:40:41.363 に答える