从命令行运行PSAKE脚本

时间:2010-10-27 11:15:03

标签: powershell tfs powershell-v2.0 psake tfs-power-tools

我正在创建一个批处理文件来执行我的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' - '

我不明白为什么那应该是特别的,因为在它上面运行命令似乎工作正常。任何人都可以解释这件事吗?这可能是一个语法错误,但我无法弄明白。

1 个答案:

答案 0 :(得分: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 尝试 {       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 }“