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

将PowerShell会话变量用作参数的默认值,powershell,powershell-4.0,Powershell,Powershell 4.0,是否可以使用存储在PowerShell会话变量中的值填充参数的默认值 在本例中,第一次运行脚本时会填充会话变量,但不会在后续执行中使用: function Get-Authetication { [cmdletbinding()] param( [parameter(Mandatory=$true)] [string]$Server = { if ($PSCmdlet.SessionState.PSVariable.Get('Server').V

是否可以使用存储在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

这应该由调用方使用来完成

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

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;
    }
}

(缩写示例)

这会提示我最初(如预期)和随后(希望避免)为这两个变量提供一个值。我不明白的是什么?@craig我想去掉
Mandatory=$true
部分。请参阅更新的代码。正如我在问题中提到的,我希望它在第一次(如果没有提供值)时提示,但不要在以后的时间提示。我尝试在代码中设置
$PSDefaultParameterValues
,但也没有达到预期效果。@craig我的示例应该适用于
$Server
,我在回答中没有针对
$Credential
这样做,但是如果
$Server
按预期工作,则可以应用相同的逻辑。
$Server
没有按预期工作。我将忽略
$Credential
,以简化问题。