可能重复:
任何好的PowerShell的MSBuild任务?
PowerShell的似乎并不有一个简单的方法用在正确与呼叫者不在PowerShell的互操作的方式任意命令,然后泡了解析和执行错误触发它-例如, cmd.exe
, TeamCity的等等。
我的问题很简单。 我与开箱即用的MSBuild V4和PowerShell v3的(开到什么是最好的方式建议,难道不排除适当的生产准备MSBuild任务,但它会需要比建议更强一点“这很容易 - 以PowerShell的任务工厂的样品和调整它和/或它成为的维护者/父“)运行一个命令(或一个小脚本段,或(最常见)时的信息的调用.ps1
脚本。
我想应该是这样的东西正常:
<Exec
IgnoreStandardErrorWarningFormat="true"
Command="PowerShell "$(ThingToDo)"" />
可悲的是不工作: -
- 如果
ThingToDo
无法解析,它静静地失败 - 如果
ThingToDo
是不存在的脚本调用,它失败 - 如果你想传播的
ERRORLEVEL
基于.cmd
结果,它变得毛茸茸 - 如果要嵌入
"
在引号ThingToDo
,它不会工作
那么,什么是运行MSBuild中的PowerShell的应该是防弹的方式? 有什么我可以PsGet使一切OK?
您可以使用下面的例子:
<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的使用。
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的版本。
我会得到我的外套。
文章来源: In MsBuild, how do I run something PowerShell and have all errors reported [duplicate]