我正在创建一个批处理文件来执行我的psake构建,同时与来自TFPT的teamcity和TFS Powershell命令行开关集成,并提出以下内容:
@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参数,它将失败并显示错误:
一元后失踪的表情 operator' - '
我不明白为什么那应该是特别的,因为在它上面运行命令似乎工作正常。任何人都可以解释这件事吗?这可能是一个语法错误,但我无法弄明白。
答案 0 :(得分:0)
“powershell.exe -command'& {。C:\ Temp \ Example.ps1 -param1 hello}'”
您的复杂功能来自您尝试构建的多行cmd变量,扩展变量的每一行都将删除您应用的任何转义序列。 我为你搞砸了一下,但后来想了....为什么不用你的脚本块创建.ps1脚本,保存任何讨厌的转义等。
所以Invoke-Build.ps1变成了 - Param($ TaskList,$ Config) Import-Module .. \ 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 $ _ } 其他 { Write-Host ERROR:$ _ -ForegroundColor RED } 退出$ Error.Count } 终于{remove-module psake}
然后你可以从cmd ......
点源脚本@echo OFF
SET COMMAND_TO_EXECUTE = Invoke-Build.ps1
echo Build命令为“%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 }“