ActionPreference/ActionPreference.ps1

#region Copyright & License

# Copyright © 2012 - 2021 François Chabot
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#endregion

Set-StrictMode -Version Latest

<#
.Synopsis
    Resolve "Action Preferences" from the caller's scope.
.DESCRIPTION
    Script module functions do not automatically inherit their caller's action preferences, but they can be obtained
    through the $PSCmdlet variable in Advanced Functions. This function is a helper function for any script module
    Advanced Function: by passing in the values of $PSCmdlet and $ExecutionContext.SessionState,
    Resolve-ActionPreference will propagate the caller's action preferences locally.
.PARAMETER Cmdlet
    The $PSCmdlet object from a script module Advanced Function.
.PARAMETER SessionState
    The $ExecutionContext.SessionState object from a script module Advanced Function. This is how the
    Resolve-ActionPreference function sets action preference variables in its callers' scope, even if that caller
    is in a different script module.
.PARAMETER Actions
    Optional array of action parameter names to retrieve from the caller's scope. Default is to retrieve
    all the following action preferences: Confirm, ErrorAction, InformationAction, Verbose, WarningAction, WhatIf.
.EXAMPLE
    Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
 
    Imports the default PowerShell preference variables from the caller into the local scope.
.EXAMPLE
    Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState -Actions ErrorAction, InformationAction
 
    Resolve only the ErrorAction and InformationAction preference variables into the local scope.
.INPUTS
    None. This function does not consume pipeline input.
.OUTPUTS
    None. This function does not produce pipeline output.
.LINK
    about_Preference_Variables
.LINK
    https://gallery.technet.microsoft.com/Inherit-Preference-82343b9d
.LINK
    https://powershell.org/2014/01/getting-your-script-module-functions-to-inherit-preference-variables-from-the-caller/
.LINK
    https://www.powershellgallery.com/packages/Carbon/2.2.0/Content/Functions%5CUse-CallerPreference.ps1
.LINK
    https://github.com/PowerShell/PowerShell/issues/4568
.NOTES
    © 2021 be.stateless.
#>

function Resolve-ActionPreference {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateScript( { $_.GetType().FullName -eq 'System.Management.Automation.PSScriptCmdlet' } )]
        [System.Management.Automation.PSCmdlet]
        $Cmdlet,

        [Parameter(Mandatory = $true)]
        [System.Management.Automation.SessionState]
        $SessionState,

        [Parameter(Mandatory = $false)]
        [ValidateSet('Confirm', 'Debug', 'ErrorAction', 'InformationAction', 'Verbose', 'WarningAction', 'WhatIf')]
        [string[]]
        $Actions = @('Confirm', 'Debug', 'ErrorAction', 'InformationAction', 'Verbose', 'WarningAction', 'WhatIf')
    )
    $Actions | ForEach-Object -Process {
        # only propagate inherited action preferences for common action parameters that were not explicitly given by arguments
        if (-not $Cmdlet.MyInvocation.BoundParameters.ContainsKey($_)) {
            $actionPreference = $Cmdlet.SessionState.PSVariable.Get($preferenceVariables.$_)
            # only propagate inherited action preferences whose according preference variables have been given a value
            if ($actionPreference) {
                if ($SessionState -eq $ExecutionContext.SessionState) {
                    Set-Variable -Scope 1 -Name $actionPreference.Name -Value $actionPreference.Value -Force -Confirm:$false -WhatIf:$false
                } else {
                    $SessionState.PSVariable.Set($actionPreference.Name, $actionPreference.Value)
                }
            }
        }
    }
}

$script:preferenceVariables = @{
    'Confirm'           = 'ConfirmPreference'
    'Debug'             = 'DebugPreference'
    'ErrorAction'       = 'ErrorActionPreference'
    'InformationAction' = 'InformationPreference'
    'Verbose'           = 'VerbosePreference'
    'WarningAction'     = 'WarningPreference'
    'WhatIf'            = 'WhatIfPreference'
}
# SIG # Begin signature block
# MIII0QYJKoZIhvcNAQcCoIIIwjCCCL4CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQ0SctFOXSgGZcryriZkoFNma
# /P6gggVMMIIFSDCCAzCgAwIBAgIJAJkr3mJdTBkUMA0GCSqGSIb3DQEBCwUAMEEx
# PzA9BgNVBAMeNgBpAGMAcgBhAGYAdABzAG8AZgB0AHcAYQByAGUAQABzAHQAYQB0
# AGUAbABlAHMAcwAuAGIAZTAeFw0yMTA2MjUxNDEyMjNaFw00MTA2MjAxNDEyMjNa
# MEExPzA9BgNVBAMeNgBpAGMAcgBhAGYAdABzAG8AZgB0AHcAYQByAGUAQABzAHQA
# YQB0AGUAbABlAHMAcwAuAGIAZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAOeqdUHBv7sxSeX3aj6yPKj7PAvs8izpVXjyEBl5aR8mQneVcXuF53AH7EW1
# 6E5p4+Az5pJPGUD5c3tXhiGMF7vgLhQjO6hlaVBRIqiIYHikNLwMNy6YBMc/QQYM
# rPhqHEFsZ53dkBIIj3M8e3kFcTFA09n25yDtTPDab4nd9yUhc9Qc8+nfpIzfYsoP
# 1pZ3nCzhw6hN2/44v1dkQrG3dRYwt+px65p6NPNZWEJpt4VCJjIFh+lBYJdxm9d4
# X/rAnlHIkbv7liOavWDzgHVabS3hdAWtcDmynm+7+FcZDFqPWNCl3e4SS7xe4s/R
# CKFKA0IsfKkSk9YJlLgeSQIEXUOOWXJAGaLqnRD8xWLZsc4Oi9GZg7XV1mv/S88c
# oztXnwtAN3OOlRKBh2QbomMgxeMO0GvsLE/cq5Q/YKAoz+KGr/7LcZq9jzQ8IPus
# ZvWLeDXmxPiwJjpZc1koLgfGIEX2NStQTT3QmacWr9thrWcKvI+4uBmI4exS9B4a
# R3nV91w5EY+2RoYsHqej9LWwNamO96+jMX9pxprTX+EkLUuMAikw/po8sBC9MUUn
# 5pMWmUv7DCtQOLGGBDDMMMkn4ZcjpCEEdPGHRKfqNnD27ssGtDjiNzfQrsm67toU
# bBwUF+gyJq/YckWquYJhA9ZOFWEADuIwGnsOzsoRvuQyY+p9AgMBAAGjQzBBMA4G
# A1UdDwEB/wQEAwIHgDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDAzAXBgNVHREEEDAO
# ggxzdGF0ZWxlc3MuYmUwDQYJKoZIhvcNAQELBQADggIBACithYM3qckZRc9+Xbfu
# a6gWr3HwjrW+FHKgjfrcOm8ZnLVapb9xFqsqrRQqd3RXWQDINEGrtI2rSfrzyfoK
# UiTgldIfQNP1ZcGY229d++90t3hdo2mlt05hjYlbMENloJHpsEP0vQZmwOcEimCT
# ex1pymYM+P9pj3j8UD1PT1eIZot6or8fBRl63UybyDSrM7L4UOkkAOniKxWy5pW6
# 6duS8SR+SZpr3Bv44NyXPj0Nv+MIpLmsLrd7XPBFmnGxzY01ZO9vzi9KEhM2wT5i
# jPqHDNOvfPiADtAa+EyUBzdJiqy9heCz/TMZQgMWGwtfqJNxWZmsHcha2anW4Qt+
# mzrLO4GojWoVog9uVSAq+l0a+YQsd1u1kUmm4vgZCFyUA+lEp4LkI7ca2VBHkLPD
# w+u2DoDMRiqFPZjO7BCKjGc0jj9B/qGR3JVt+tqDdB621xXf2YGF2oFvxZQ/keGt
# 0ujfJ+JwN3nCulDAA4773q6KUnfykyrvAgITNbRJL6TngeRKtw9VIJBPxzqMzLpV
# 5ggXNituwLaD1CCBJ1oo9DZHpL9gplXp1wGrelJOTiJhh+pdNsPtRH7CrranWa5h
# LFLuigqin0eewQ5giJ1VaiBVEseOmiZog+27UpFIv40aDzgGL3YxB/Mu0ojwrQtp
# WLmqJCmWnR5qxOm0yK+zNWe0MYIC7zCCAusCAQEwTjBBMT8wPQYDVQQDHjYAaQBj
# AHIAYQBmAHQAcwBvAGYAdAB3AGEAcgBlAEAAcwB0AGEAdABlAGwAZQBzAHMALgBi
# AGUCCQCZK95iXUwZFDAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAA
# oQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4w
# DAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUgfRxOQviAs2kIFoDo6Ob00XW
# xYswDQYJKoZIhvcNAQEBBQAEggIAyeTuIb0RcYobGfPdeso6LDhO7u8aeNxeG7k5
# nwLDuzzEDw1XUKWdhU1TndHgNWAqMWnCPRpkaTDF9b+XURIuW+Ub+JWeajG2oAtX
# dK6KrBg0QewGf0tpINcH8qZY2PfSL2BUAiHgEOsQa8huckg+0iL++rLtWI0CvYsH
# +YGnLTzI+aPtbbXDy348sckXXu9DFFjjOCopu96Uvtvjzk99yTGEULr/0ImSPKBA
# RjDk44e/JysAQMwTvxz+DxT4wO/SIVd/x39O9Bq/YB7K4q963RV+faY8WvpMu0zS
# Y5KD+d8QeAxaXIX4McIRq+02V9THB117q4LZzAgPfWDPwhvvbGZ1V+M+yXklYqpH
# 0dMQeF2PoKXMC0pCdoXJOjIApvMoFfWxddvWeOxMYfGHsZD+yz7fvw81+c86IyvY
# DB0SG2B1pmbLrWsyD2OdLqcFcYn808OF/od2K8eKmhcmJ4vi0twtFHK24pdbuEWY
# BcRpfOYZ46IkCUqUiSx8tBWAR3powylVbcemlFbbjBFZ2dq0EAT2s4daQ93NbVWw
# eshA7qpxO30Z2ePPrRDJpQRfSQHDNREzXL6j6pzc+xr0tDesay10c9MaXRv3C2V2
# Y8ils/zN/xbF2D21KWcTctJIhzbUqDl8PIZJaKneQ6O85+bWogM0PcP1IMpp8Y6K
# VANyfMM=
# SIG # End signature block