根据about_Parameters_Default_Values文档,
$PSDefaultParameterValues 首选项变量允许您为任何 cmdlet 或高级函数指定自定义默认值。
但是,实际上,这似乎不适用于脚本高级功能(请参阅下面脚本中的示例部分)。
使用Script和Local范围,核心 PowerShell Cmdlet(即Write-Host)的默认值工作正常,但脚本本身的任何参数都不会从 接收到$PSDefaultParameterValues,无论是否定义了默认值,或者是否有公共参数。
<#
.Synopsis
Test the handling of $PSDefaultParameterValues.
.Parameter UnspecifiedParam
A parameter with no default.
.Parameter DefaultParam
A parameter with a default.
.Example
Test-DefaultParam.ps1
Name Value
---- -----
InitialPSBoundParameters {}
InitialUnspecifiedParam
InitialDefaultParam DefinedDefaultValue
Script:PSDefaultParameterValues:Write-Host
WARNING: UnspecifiedParam default was not received
WARNING: DefaultParam default was not received
WARNING: Verbose default was not received
PSDefaultParameterValues {Test-DefaultParam:Verbose, Test-DefaultParam:DefaultParam, Test-DefaultParam:UnspecifiedParam}
PSDPVUnspecifiedParam Script:PSDefaultParameterValues:UnspecifiedParam
PSDPVDefaultParam Script:PSDefaultParameterValues:DefaultParam
PSDPVVerbose True
PSDPVWriteHost Script:PSDefaultParameterValues:Write-Host
PSBoundParameters {}
UnspecifiedParam
DefaultParam DefinedDefaultValue
Local:PSDefaultParameterValues:Write-Host
WARNING: UnspecifiedParam default was not received
WARNING: DefaultParam default was not received
WARNING: Verbose default was not received
PSDefaultParameterValues {Test-DefaultParam:Verbose, Test-DefaultParam:DefaultParam, Test-DefaultParam:UnspecifiedParam}
PSDPVUnspecifiedParam Local:PSDefaultParameterValues:UnspecifiedParam
PSDPVDefaultParam Local:PSDefaultParameterValues:DefaultParam
PSDPVVerbose True
PSDPVWriteHost Local:PSDefaultParameterValues:Write-Host
PSBoundParameters {}
UnspecifiedParam
DefaultParam DefinedDefaultValue
.Link
https://technet.microsoft.com/library/hh847819.aspx
#>
[CmdletBinding()] Param(
[string]$UnspecifiedParam,
[string]$DefaultParam = 'DefinedDefaultValue'
)
$psdpv = @{}
$PSDefaultParameterValues.GetEnumerator() |
? Name -like 'Test-DefaultParam:*' |
% {[void]$psdpv.Add($_.Name,$_.Value)}
if(!$psdpv.Count)
{
[ordered]@{
InitialPSBoundParameters = $PSBoundParameters
InitialUnspecifiedParam = $UnspecifiedParam
InitialDefaultParam = $DefaultParam
}
$Script:PSDefaultParameterValues = @{
'Test-DefaultParam:UnspecifiedParam' = 'Script:PSDefaultParameterValues:UnspecifiedParam'
'Test-DefaultParam:DefaultParam' = 'Script:PSDefaultParameterValues:DefaultParam'
'Test-DefaultParam:Verbose' = $true
'Write-Host:Object' = 'Script:PSDefaultParameterValues:Write-Host'
}
Test-DefaultParam.ps1
$Local:PSDefaultParameterValues = @{
'Test-DefaultParam:UnspecifiedParam' = 'Local:PSDefaultParameterValues:UnspecifiedParam'
'Test-DefaultParam:DefaultParam' = 'Local:PSDefaultParameterValues:DefaultParam'
'Test-DefaultParam:Verbose' = $true
'Write-Host:Object' = 'Local:PSDefaultParameterValues:Write-Host'
}
Test-DefaultParam.ps1
}
else
{
Write-Verbose "PSDefaultParameterValues exist"
Write-Host
if(!$UnspecifiedParam) {Write-Warning 'UnspecifiedParam default was not received'}
if($DefaultParam -eq 'DefinedDefaultValue') {Write-Warning 'DefaultParam default was not received'}
if($VerbosePreference -eq 'SilentlyContinue') {Write-Warning 'Verbose default was not received'}
[ordered]@{
PSDefaultParameterValues = $psdpv
PSDPVUnspecifiedParam = $PSDefaultParameterValues['Test-DefaultParam:UnspecifiedParam']
PSDPVDefaultParam = $PSDefaultParameterValues['Test-DefaultParam:DefaultParam']
PSDPVVerbose = $PSDefaultParameterValues['Test-DefaultParam:Verbose']
PSDPVWriteHost = $PSDefaultParameterValues['Write-Host:Object']
PSBoundParameters = $PSBoundParameters
UnspecifiedParam = $UnspecifiedParam
DefaultParam = $DefaultParam
}
}
Run Code Online (Sandbox Code Playgroud)
是的,它可以:
PS> Set-Content .\Test\FileName.ps1 @'
>>> [CmdletBinding()]
>>> param(
>>> $ParameterName='DefaultValue'
>>> )
>>> $ParameterName
>>> '@
PS> .\Test\FileName.ps1
DefaultValue
PS> $PSDefaultParameterValues['FileName.ps1:ParameterName']='DifferentValue'
PS> .\Test\FileName.ps1
DifferentValue
Run Code Online (Sandbox Code Playgroud)