Any good PowerShell MSBuild tasks?

后端 未结 4 868
醉话见心
醉话见心 2020-12-03 09:05

Anyone know of any good MSBuild tasks that will execute a PowerShell script and pass it different parameters?

I was able to find B# .NET Blog: Invoking PowerShell sc

4条回答
  •  醉梦人生
    2020-12-03 10:00

    Duplicate Question and Answer I Posted, here for posterity for when it has been vote to closed. The key difference is that this question was constrained to being OOTB and my self-answer stays within that constraint.

    Question

    Powershell doesn't seem to have an easy way to trigger it with an arbitrary command and then bubble up parse and execution errors in a way that correctly interoperates with callers that are not PowerShell - e.g., cmd.exe, TeamCity etc.

    My question is simple. What's the best way for me with OOTB MSBuild v4 and PowerShell v3 (open to suggestions-wouldnt rule out a suitably production ready MSBuild Task, but it would need to be a bit stronger than suggesting "it's easy - taking the PowerShell Task Factory sample and tweak it and/or becoming it's maintainer/parent") to run a command (either a small script segment, or (most commonly) an invocation of a .ps1 script.

    I'm thinking it should be something normal like:

    
    

    That sadly doesn't work:-

    1. if ThingToDo fails to parse, it fails silently
    2. if ThingToDo is a script invocation that doesn't exist, it fails
    3. if you want to propagate an ERRORLEVEL based .cmd result, it gets hairy
    4. if you want to embed " quotes in the ThingToDo, it won't work

    So, what is the bullet proof way of running PowerShell from MSBuild supposed to be? Is there something I can PsGet to make everything OK?

    Answer

    Weeeeelll, you could use something long winded like this until you find a better way:-

    
      <__PsInvokeCommand>powershell "Invoke-Command
      <__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';
      <__BlockEnd>; exit $LASTEXITCODE }
      <_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)
      <_PsCmdEnd>$(__BlockEnd)"
    
    

    And then 'all' you need to do is:

    
    

    The single redeeming feature of this (other than trapping all error types I could think of), is that it works OOTB with any PowerShell version and any MSBuild version.

    I'll get my coat.

提交回复
热议问题