首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从命令行运行PSAKE脚本

从命令行运行PSAKE脚本
EN

Stack Overflow用户
提问于 2010-10-27 11:15:02
回答 1查看 1.7K关注 0票数 0

我正在创建一个批处理文件,以便在集成teamcity和来自TFPT的TFS Powershell命令时执行我的psake构建,并提供了以下内容:

代码语言:javascript
复制
@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参数的命令将失败,出现错误:

在一元运算符'-‘之后缺少

表达式

我不明白为什么会这样,特别是因为单独运行命令似乎很好。有人能说明这件事吗?这可能是某个地方的语法错误,但我搞不懂。

EN

回答 1

Stack Overflow用户

发布于 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#}”)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4032604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档