将PowerShell会话变量用作参数的默认值
是否可以使用存储在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
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
,以简化问题。