ActionPreference/ActionPreference.ps1

#region Copyright & License

# Copyright © 2012 - 2022 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 Action
   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 -Action 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
   © 2022 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[]]
      $Action = @('Confirm', 'Debug', 'ErrorAction', 'InformationAction', 'Verbose', 'WarningAction', 'WhatIf')
   )
   $Action | 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
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUIy9K0yfGQ65We4tCzGKM/VE/
# Lf2gggVMMIIFSDCCAzCgAwIBAgIJAJkr3mJdTBkUMA0GCSqGSIb3DQEBCwUAMEEx
# 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
# DAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU3lHY3scDldGuth3cKdlRRmh9
# 9rQwDQYJKoZIhvcNAQEBBQAEggIAypBB1ZWWGJwI0hyIDB3RENlWj00xGTcSQFE1
# c+CbO8TNFqml+qeekRB+l7JK7ZcDBTDdC3hhiZKszDBHnTIHlgRRa9uDmoHiZgJy
# pB7JhNBUrqRSAs4+lJsq2y1DiJvjd3N4588IHK3vstqLdET7FuR/CU5Y2pC6pf/T
# Raxq1O9oMX6B92DOLZVESxgY/Cs6Ah7xkprQWqSfcT8Cc5H4fsHRGjo+x1DwH/d6
# Utb43GLhWqY9zlXbFy3pibDxOizf5H/B7QSVbEGVbzr3co0MMncCblaEGJx0Aqmz
# VRCPsb0PYQlBUzSKAUu87RfFo3h+9Otoe4qc1Qv5PnW0bF4JU/jV4VkTJ9TG6oNq
# BTh7HoclV9mbT2I/TpsI2Kc12BUXrS7niIQzQJWfEZ+IacMhAZmem7X18PjwO5HH
# EYCcIpD8pgLoUxBoqvVQCdZbEmfNn7WovmJYk0VJT/kCQ2YYuVzx50v64zdBmnex
# VF6rY/Pcx1afLZ6zJaRYftmxlxlhijQ+e5u81E3mDL4pszy3bSwL64OVpqzwK58+
# gBRIK6v8P4fZj9Co7PtJ8wG7MO8idr0T/1gw5nNdEvspzb047L90+8wkUyHDfeLV
# Ixejht5bt9ecP75EGw9g1U7LEbIp9OyvSM3z58BBnuJUhkTANk1Ofk2bmeTwOu1J
# ydeElP0=
# SIG # End signature block