【问题标题】:Can $PSDefaultParameterValues send default parameter values to scripts?$PSDefaultParameterValues 可以将默认参数值发送到脚本吗?
【发布时间】:2015-10-22 23:33:56
【问题描述】:

根据about_Parameters_Default_Values 文档,

$PSDefaultParameterValues 首选项变量允许您为任何 cmdlet 或高级函数指定自定义默认值。

但是,实际上,这似乎不适用于脚本高级功能(请参阅下面脚本中的示例部分)。

同时使用 ScriptLocal 范围,核心 PowerShell Cmdlet 的默认值(即 Write-Host)工作正常,但脚本本身的参数均未从 $PSDefaultParameterValues 接收,无论是否存在默认定义与否,或是否为通用参数。

测试-DefaultParam.ps1
<#
.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


【解决方案1】:

是的,它可以:

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

【讨论】:

  • ☺ 是的,就是这样!我所需要的只是将脚本中的所有Test-DefaultParam: 替换为Test-DefaultParam.ps1:,并且无论是否使用实际的“.ps1”来调用脚本,它都可以正常工作。谢谢! ?
  • @MathiasR.Jessen 我也是;我最终也能让你的方法奏效。不过,我松了一口气,我不受限于这种方法。 :)
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 2014-04-28
  • 2012-09-13
  • 2023-02-25
  • 2015-05-19
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多