Запуск скрипта PSAKE из командной строки

Я создаю пакетный файл для выполнения моих сборок 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, завершается с ошибкой:

Отсутствует выражение после унарного оператора '-'

Я не понимаю, почему это должно быть, особенно потому, что запуск команды сам по себе работает нормально. Кто-нибудь может пролить свет на этот вопрос? Вероятно, где-то синтаксическая ошибка, но я не могу понять.


person Jimit    schedule 27.10.2010    source источник


Ответы (1)


Хммм, думаю, вам нужно поколдовать с эскейп-символами. Любой вызов powershell, который я делаю из cmd, я стараюсь сохранить следующим образом:

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

Ваша сложность возникает из-за многострочной переменной cmd, которую вы пытаетесь создать, каждая строка по мере расширения переменной удалит любые escape-последовательности, которые вы применяете. Я немного повозился для вас, но потом подумал... почему бы вам просто не создать скрипт .ps1 с вашим блоком скриптов, сохранить любые неприятные экранирования и т. д.

Итак, Invoke-Build.ps1 становится - Param($TaskList, $Config) Import-Module ..\tools\psake\psake.psm1 try { invoke-psake -framework 4.0 -taskList $TaskList -properties @{config=$Config} } поймать { . ..\tools\psake\teamcity.ps1; if(![string]::IsNullOrEmpty($env:TEAMCITY_VERSION)) { TeamCity-ReportBuildStatus -status FAILURE -text $_ } else {Write-Host ERROR: $_ -ForegroundColor RED } exit $Error.Count } наконец {удалить -модуль psake}

Затем вы можете просто указать источник сценария из cmd......

@эхо ВЫКЛ.

SET COMMAND_TO_EXECUTE=Invoke-Build.ps1

Команда echo Build: "%COMMAND_TO_EXECUTE%"

ЕСЛИ %PROCESSOR_ARCHITECTURE% == x86 ( powershell -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1" -Version "2.0" -NoProfile -ExecutionPolicy unlimited -Command "& {. %COMMAND_TO_EXECUTE% -TaskList -Config}" ) ELSE ( C:\ Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1" -Версия "2.0" -NoProfile -ExecutionPolicy unlimited -Command "& {.%COMMAND_TO_EXECUTE% -TaskList -Config}"

person WillWhite123    schedule 08.11.2010