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
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.
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:-
ThingToDo
fails to parse, it fails silentlyThingToDo
is a script invocation that doesn't exist, it failsERRORLEVEL
based .cmd
result, it gets hairy"
quotes in the ThingToDo
, it won't workSo, what is the bullet proof way of running PowerShell from MSBuild supposed to be? Is there something I can PsGet to make everything OK?
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.