在MsBuild中,如何运行PowerShell并报告所有错误
可能重复:在MsBuild中,如何运行PowerShell并报告所有错误,powershell,error-handling,msbuild,teamcity,msbuild-task,Powershell,Error Handling,Msbuild,Teamcity,Msbuild Task,可能重复: Powershell似乎没有一种简单的方法可以用任意命令触发它,然后以一种与非Powershell调用方正确交互的方式抛出解析和执行错误,例如,cmd.exe,等等 我的问题很简单。对我来说,使用OOTB MSBuild v4和PowerShell v3(接受建议)运行命令的最佳方式是什么(接受建议不会排除适合生产的MSBuild任务,但它需要比建议“使用PowerShell任务工厂示例并对其进行调整和/或成为其维护者/父对象更简单”)(小脚本段,或(最常见)调用.ps1脚本 我认
Powershell似乎没有一种简单的方法可以用任意命令触发它,然后以一种与非Powershell调用方正确交互的方式抛出解析和执行错误,例如,
cmd.exe
,等等
我的问题很简单。对我来说,使用OOTB MSBuild v4和PowerShell v3(接受建议)运行命令的最佳方式是什么(接受建议不会排除适合生产的MSBuild任务,但它需要比建议“使用PowerShell任务工厂示例并对其进行调整和/或成为其维护者/父对象更简单”)(小脚本段,或(最常见)调用.ps1
脚本
我认为这应该是正常的,比如:
<Exec
IgnoreStandardErrorWarningFormat="true"
Command="PowerShell "$(ThingToDo)"" />
不幸的是,这不起作用:-
ThingToDo
解析失败,它将以静默方式失败ThingToDo
是不存在的脚本调用,则会失败.cmd的ERRORLEVEL
结果,它会很麻烦
ThingToDo
中嵌入“
引号,它将不起作用那么,从MSBuild运行PowerShell的防弹方法应该是什么?有什么方法可以让一切正常吗?Weeeell,在找到更好的方法之前,您可以使用像这样冗长的方法:-
<PropertyGroup>
<__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand>
<__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin>
<__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd>
<_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</PsCmdStart>
<_PsCmdEnd>$(__BlockEnd)"</PsCmdEnd>
</PropertyGroup>
powershell“调用”命令
-ScriptBlock{$errorActionPreference='Stop';
;退出$LASTEXITCODE}
$(\uu PsInvokeCommand)$(\uu BlockBegin)
$(_BlockEnd)”
然后你需要做的就是:
<Exec
IgnoreStandardErrorWarningFormat="true"
Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" />
这一功能的唯一补救功能(除了捕获我能想到的所有错误类型之外)是,它可以与任何PowerShell版本和任何MSBuild版本一起使用OOTB
我去拿外套。你可以用下面的例子:
<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中使用。我想你指的是?这就是我在思考问题中半软弱的OOTB位的原因,感谢你让我意识到这是一个重复的问题。请看,你能投票结束这个问题吗(假设你同意)