Запуск скрипта PSAKE из командной строки - PullRequest
0 голосов
/ 27 октября 2010

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

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

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

1 Ответ

0 голосов
/ 09 ноября 2010

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

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

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

Итак, Invoke-Build.ps1 становится - Param ($ TaskList, $ Config) Модуль импорта .. \ tools \ psake \ psake.psm1 пытаться { invoke-psake -framework 4.0 -taskList $ TaskList -properties @ {config = $ Config} } ловить { , .. \ инструменты \ psake \ teamcity.ps1; если ([строка] :: IsNullOrEmpty ($ ENV: TEAMCITY_VERSION)) { TeamCity-ReportBuildStatus -status FAILURE -text $ _ } еще { ОШИБКА записи-хоста: $ _ -ForegroundColor RED } выход $ Error.Count } наконец-то {remove-module 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 неограниченный -Command "& {.% COMMAND_TO_EXECUTE% -TaskList -Config}" ) ELSE ( C: \ Windows \ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell.exe -PSConsoleFile "% TFSPowerToolDir% tfshell.psc1" -Version "2.0" -NoProfile -ExecutionPolicy неограниченный -Command "& {.% COMMAND_TO_EXECUTEConfis-%as-% «

...