Я создаю пакетный файл для выполнения моих сборок psake при интеграции с teamcity и командлетами TFS Powershell из TFPT и придумал следующее:
@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%
У меня были проблемы со сборками, которые не завершались сбоем в TeamCity, когда возникали ошибки из-за того, что Powershell никогда не завершался с ненулевым кодом выхода. Итак, что я пытаюсь сделать в приведенном выше сценарии, так это поймать любые завершающие ошибки команды Invoke-Psake, сообщить об ошибке в teamcity и выйти из процесса с ненулевым кодом, равным количеству произошедших ошибок. Насколько я могу судить, сценарий выглядит нормально. Запуск полученной команды сам по себе, похоже, работает нормально. Однако запуск его как части командного файла выше с командой, назначенной аргументу -Command исполняемого файла powershell, завершается с ошибкой:
Отсутствует выражение после унарного оператора '-'
Я не понимаю, почему это должно быть, особенно потому, что запуск команды сам по себе работает нормально. Кто-нибудь может пролить свет на этот вопрос? Вероятно, где-то синтаксическая ошибка, но я не могу понять.