Powershell 从命令行运行PSAKE脚本

Powershell 从命令行运行PSAKE脚本,powershell,tfs,powershell-2.0,psake,tfs-power-tools,Powershell,Tfs,Powershell 2.0,Psake,Tfs Power Tools,我正在创建一个批处理文件来执行我的psake构建,同时与teamcity和TFPT的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 C

我正在创建一个批处理文件来执行我的psake构建,同时与teamcity和TFPT的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%
在TeamCity中,由于Powershell从未以非零退出代码退出而出现错误时,我遇到了构建未失败的问题。因此,我试图在上面的脚本中捕获Invoke-Psake命令中的任何终止错误,将错误报告给teamcity,并使用与已发生的错误数相等的非零代码退出流程。据我所知,剧本似乎还不错。单独运行生成的命令似乎效果不错。但是,在将命令分配给powershell可执行文件的-command参数的情况下,将其作为上述批处理文件的一部分运行会失败,并出现以下错误:

一元数后缺少表达式 运算符'-'


我不明白为什么会这样,尤其是因为单独运行命令似乎效果不错。有人能解释这件事吗?这可能是某个地方的语法错误,但我无法理解。

Hmmm,我想你需要对转义字符进行一些处理。 从cmd调用powershell时,我都会尽量保持以下形式-

powershell.exe-命令“&{.C:\Temp\Example.ps1-param1 hello}”

您的复杂性来自您试图构建的多行cmd变量,变量展开时的每一行都将删除您应用的任何转义序列。 我给你弄了点麻烦,但后来想。。。。为什么不直接用脚本块创建.ps1脚本,以避免任何令人讨厌的转义等

因此,Invoke-Build.ps1变为- 参数$TaskList,$Config 导入模块..\tools\psake\psake.psm1 尝试 { 调用psake-framework4.0-taskList$taskList-properties@{config=$config} } 接住 { …\tools\psake\teamcity.ps1; if![string]::IsNullOrEmpty$env:TEAMCITY\u版本 { TeamCity ReportBuildStatus-状态失败-文本$_ } 其他的 { 写入主机错误:$\ ForegroundColor红色 } 退出$Error.Count } 最后{remove module psake}

然后您可以从cmd中点源脚本

@回音

将命令_设置为_EXECUTE=Invoke-Build.ps1

echo生成命令为%command\u TO\u EXECUTE%

如果%PROCESSOR_ARCHITECTURE%==x86 powershell-PSConsoleFile%TFSPowerToolDir%tfshell.psc1-Version 2.0-NoProfile-ExecutionPolicy unrestricted-Command&{.%Command_TO_EXECUTE%-TaskList-Config} 其他的 C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe-PSConsoleFile%TFSPowerToolDir%tfshell.psc1-Version 2.0-NoProfile-ExecutionPolicy unrestricted-Command&{.%Command\u TO\u EXECUTE%-TaskList-Config}