【发布时间】:2015-10-22 23:33:56
【问题描述】:
根据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
}
}
【问题讨论】:
-
投反对票似乎有点过分。老实说,我不知道如何才能对这个问题进行任何更多研究。
标签: powershell