【问题标题】:Running PSAKE script from the command line从命令行运行 PSAKE 脚本
【发布时间】:2011-05-01 06:18:08
【问题描述】:

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

当由于 Powershell 从未以非零退出代码退出而发生错误时,我遇到了构建未在 TeamCity 中失败的问题。所以我在上面的脚本中尝试做的是从 Invoke-Psake 命令中捕获任何终止错误,将错误报告给 teamcity 并使用等于已发生错误数量的非零代码退出进程。据我所知,脚本似乎很好。自行运行生成的命令似乎工作正常。但是,使用分配给 powershell 可执行文件的 -Command 参数的命令将其作为上述批处理文件的一部分运行它会失败并出现错误:

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

我不明白为什么会这样,因为单独运行命令似乎可以正常工作。任何人都可以对此事有所了解吗?这可能是某个地方的语法错误,但我无法弄清楚。

【问题讨论】:

    标签: powershell tfs powershell-2.0 psake tfs-power-tools


    【解决方案1】:

    嗯,你认为你需要对逃生角色施展魔法。 我从 cmd 执行的任何 powershell 调用我都尝试保持格式如下 -

    "powershell.exe -command '& {.C:\Temp\Example.ps1 -param1 hello}'"

    您的复杂性来自您尝试构建的多行 cmd 变量,变量展开时的每一行都会删除您应用的任何转义序列。 我为你搞砸了一点,但后来想......你为什么不直接创建带有脚本块的 .ps1 脚本,保存任何讨厌的转义等。

    所以 Invoke-Build.ps1 变为 - 参数($TaskList, $Config) 导入模块 ..\tools\psake\psake.psm1 尝试 { 调用-psake -framework 4.0 -taskList $TaskList -properties @{config=$Config} } 抓住 { . ..\工具\psake\teamcity.ps1; if(![string]::IsNullOrEmpty($env:TEAMCITY_VERSION)) { TeamCity-ReportBuildStatus -status FAILURE -text $_ } 别的 { 写入主机错误:$_ -ForegroundColor RED } 退出 $Error.Count } 最后 {remove-module psake}

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

    @echo 关闭

    SET COMMAND_TO_EXECUTE=Invoke-Build.ps1

    echo 构建命令是“%COMMAND_TO_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_TO_EXECUTE% -TaskList -Config} "

    【讨论】:

      猜你喜欢
      • 2018-10-05
      • 2020-03-15
      • 2012-05-03
      • 2013-09-14
      • 2013-07-18
      • 1970-01-01
      相关资源
      最近更新 更多