0

我正在创建一个批处理文件来执行我的 psake 构建,同时与 teamcity 和 TFPT 的 TFS Powershell commandlet 集成,并提出了以下内容:

@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} } 抓住 { 。..\工具\psake\teamcity.ps1;if(![string]::IsNullOrEmpty($env:TEEAMCITY_VERSION)) { TeamCity-ReportBuildStatus -status FAILURE -text $_ } else { Write-Host ERROR: $_ -ForegroundColor RED } exit $Error.Count } finally {remove -模块psake}

然后你可以从 cmd 点源脚本......

@echo 关闭

SET COMMAND_TO_EXECUTE=调用-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 回答