在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 &quot;$(ThingToDo)&quot;" />


不幸的是,这不起作用:-

  • 如果
    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位的原因,感谢你让我意识到这是一个重复的问题。请看,你能投票结束这个问题吗(假设你同意)