我正在创建一个批处理文件,以便在集成teamcity和来自TFPT的TFS Powershell命令时执行我的psake构建,并提供了以下内容:
@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从未退出非零退出代码,我遇到了问题。因此,在上面的脚本中,我要做的是捕获调用-Psake命令中的任何终止错误,将错误报告给工作组,并使用与已经发生的错误数相同的非零代码退出进程。据我所知,剧本看上去不错。单独运行生成的命令似乎很好。但是,将其作为上面批处理文件的一部分运行,并分配给powershell可执行文件的-Command参数的命令将失败,出现错误:
在一元运算符'-‘之后缺少
表达式
我不明白为什么会这样,特别是因为单独运行命令似乎很好。有人能说明这件事吗?这可能是某个地方的语法错误,但我搞不懂。
发布于 2010-11-08 21:40:41
嗯,觉得你需要用转义字符来施点魔法。如果我从cmd调用powershell,我试着保持格式如下-
"powershell.exe -command '& {. C:\Temp\Example.ps1 -param1 hello}'“
您的复杂性来自您正在尝试构建的多行cmd变量,当变量展开时,每一行都将删除您应用的任何转义序列。我为你捣乱了一点,但后来想.你为什么不直接用你的脚本块创建.ps1脚本,避免任何令人讨厌的逃避等等。
因此,Invoke-Build.ps1变成- Param( $TaskList,$Config)导入模块..\tools\psake\psake.psm1尝试{invoke psake -framework 4.0 -taskList $TaskList -properties @{config=$Config} } catch {。..\tools\psake\teamcity.ps1;if(::IsNullOrEmpty($env:TEAMCITY_VERSION)) { TeamCity-ReportBuildStatus -status FAILURE -text $_ }if{写-主机错误:$_ -ForegroundColor RED } exit $Error.Count }最后{remove}
然后你就可以从cmd点出脚本.
@echo OFF
设置命令_TO_EXECUTE=Invoke-Build.ps1
回显构建命令是"%COMMAND_TO_EXECUTE%“
如果C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe %PROCESSOR_ARCHITECTURE% == x86 ( powershell -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1“-Version "2.0”-NoProfile -ExecutionPolicy -NoProfile -ExecutionPolicy -Command "& {. %COMMAND_TO_EXECUTE% -TaskList -Config}“),则为(== -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1”-Version "2.0“-NoProfile-ExecutionPolicy United%TFSPowerToolDir%tfshell.psc1 "& {en19 en21#}”)
https://stackoverflow.com/questions/4032604
复制相似问题