使用 PowerShell 会话变量作为参数的默认值

Use PowerShell session variables as default values for parameters

存储在 PowerShell 会话变量中的值可以用于填充参数的默认值吗?

在此示例中,会话变量是在脚本首次 运行 时填充的,但不会在后续执行中使用:

function Get-Authetication
{

    [cmdletbinding()]
    param(
        [parameter(Mandatory=$true)]
        [string]$Server = { if ($PSCmdlet.SessionState.PSVariable.Get('Server').Value) { $PSCmdlet.SessionState.PSVariable.Get('Server').Value } },

        [parameter(Mandatory=$true)]
        [pscredential]$Credential = (Get-Credential)

    )

    # store
    $PSCmdlet.SessionState.PSVariable.Set('Server',$Server)
    $PSCmdlet.SessionState.PSVariable.Set('Credential',$Credential)

    # return for testing
    [PsCustomObject]@{
        Server=$PSCmdlet.SessionState.PSVariable.Get('Server').Value;
        Username=($PSCmdlet.SessionState.PSVariable.Get('Credential').Value).Username
    }
}

Get-Authetication

这应该由调用者使用 $PSDefaultParameterValues 完成。

或者,在函数中执行而不是使用默认值:

function Get-Authetication
{

    [cmdletbinding()]
    param(
        [parameter()]
        [string]$Server,

        [parameter()]
        [pscredential]$Credential = (Get-Credential)

    )
    if (!$PSCmdlet.SessionState.PSVariable.Get('Server').Value -and !$Server) {
        $Server = Read-Host 'Enter server'
        # Alternatively
        # throw [System.ArgumentException]'You must supply a Server value'
    }
    if ($Server) {
        $PSCmdlet.SessionState.PSVariable.Set('Server',$Server)
    }
    $myServer = $PSCmdlet.SessionState.PSVariable.Get('Server').Value

    # return for testing
    [PsCustomObject]@{
        Server=$myServer;
    }
}

(缩写示例)