2016-10-05 77 views
1

存儲在PowerShell會話變量中的值是否可用於填充參數的默認值?使用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 

回答

2

這應該通過使用$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; 
    } 
} 

(簡稱例子)

+0

這促使我最初提供兩個變量的值(如預期),隨後(希望能夠避免)。我不瞭解什麼? – craig

+0

@craig我打算帶走'Mandatory = $ true'部分。查看更新的代碼。 – briantist

+0

正如我在問題中提到的,我希望它第一次提示(如果有值),但不提示後續時間。我嘗試在代碼中設置'$ PSDefaultParameterValues',但是這並沒有達到預期的效果。 – craig

相關問題