Private/Invoke-ConsoleCommand.ps1

# From Carbon module (get-carbon.org)
# https://bitbucket.org/splatteredbits/carbon/src/05b30be36ba4105147c8a9cbcad815a366e9f553/Carbon/Functions/Invoke-ConsoleCommand.ps1?at=default&fileviewer=file-view-default

function Invoke-ConsoleCommand {
    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter(Mandatory)]
        [string]$Target,

        [Parameter(Mandatory)]
        [string]$Action,

        [Parameter(Mandatory)]
        [scriptblock]$ScriptBlock
    )

    Set-StrictMode -Version 'Latest'

    if(-not $PSCmdlet.ShouldProcess($Target, $Action)){
        return
    }

    $output = Invoke-Command -ScriptBlock $ScriptBlock
    if ($LASTEXITCODE) {
        $output = $output -join [Environment]::NewLine
        Write-Error ('Failed action ''{0}'' on target ''{1}'' (exit code {2}): {3}' -f $Action, $Target, $LASTEXITCODE, $output)
    } else {
        $output | Where-Object { $_ -ne $null } | Write-Verbose
    }
}