Private/Invoke-ExpressionAndThrowIfFailed.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function Invoke-ExpressionAndThrowIfFailed {
    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateNotNull()]
        [string]
        $command,
        [Parameter(Mandatory = $false, Position = 1)]
        [string]
        $callingFunctionName = "undef"
    )

    begin {
        $functionName = $MyInvocation.MyCommand
        Write-Verbose "[$functionName] Begin"

        # Check if the caller was called with -WhatIf -Confirm switches
        if (-not $PSBoundParameters.ContainsKey('Confirm')) {
            $ConfirmPreference = $PSCmdlet.SessionState.PSVariable.GetValue('ConfirmPreference')
        }
        if (-not $PSBoundParameters.ContainsKey('WhatIf')) {
            $WhatIfPreference = $PSCmdlet.SessionState.PSVariable.GetValue('WhatIfPreference')
        }
    }

    end {
        if ($pscmdlet.ShouldProcess($command)) {
            $output = Invoke-Expression $command
            if ((-not $?) -or ($LASTEXITCODE -ne 0)) {
                throw "[$callingFunctionName]: invoke-expression failed for command $command. Command output: $output"
            }
            $output
        }

        Write-Verbose "[$functionName] End"
    }
}