Powershell似乎没有一种简单的方法可以使用任意命令触发它,然后以正确与非PowerShell调用者互操作的方式冒泡解析和执行错误 - 例如cmd.exe
,{ {3}}等等。
我的问题很简单。我与开箱即用的MSBuild V4和PowerShell v3的(开到什么是最好的方式建议,难道不排除适当的生产准备MSBuild任务,但它会需要比建议更强一点“这很容易 - 以PowerShell的任务工厂的样品和调整它和/或成为它的维护者/父母“”来运行一个命令(一个小的脚本段,或(最常见的)一个.ps1
脚本的调用。
我认为这应该是正常的:
<Exec
IgnoreStandardErrorWarningFormat="true"
Command="PowerShell "$(ThingToDo)"" />
遗憾的是,这不起作用: -
ThingToDo
无法解析,则会无声地失败ThingToDo
是不存在的脚本调用,则会失败ERRORLEVEL
的{{1}}结果,则会变得毛茸茸.cmd
中嵌入"
引号,则无法使用那么,从MSBuild运行PowerShell的防弹方法是什么?有什么我可以TeamCity让一切都好吗?
答案 0 :(得分:2)
您可以使用以下示例:
<InvokeScript Condition="..."
PowerShellProperties="..."
ScriptFile="[PATH TO PS1 FILE]"
Function="[FUNCTION TO CALL IN PS1]"
Parameters="..."
RequiredOutputParams="...">
<!-- You can catch the output in an Item -->
<Output TaskParameter="OutputResults"
ItemName="Output" />
</InvokeScript>
这可以在MSBuild中使用。
答案 1 :(得分:1)
Weeeeelll,你可以使用像这样长篇大论的东西,直到找到更好的方法: -
<PropertyGroup>
<__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand>
<__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin>
<__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd>
<_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</PsCmdStart>
<_PsCmdEnd>$(__BlockEnd)"</PsCmdEnd>
</PropertyGroup>
然后你需要做的就是“全部”:
<Exec
IgnoreStandardErrorWarningFormat="true"
Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" />
这个的单一兑换功能(除了捕获我能想到的所有错误类型除外)是它可以在任何PowerShell版本和任何MSBuild版本上运行OOTB。
我会得到我的外套。