Добавьте атрибуты к "системным параметрам" (например, те, которые добавлены через CmdletBinding / SupportsPaging)

Можно ли добавить атрибуты к системным параметрам?

скажем, у меня есть функция, которая поддерживает подкачку:

function Get-MyPage {
    [CmdletBinding(SupportsPaging = $true)]
    param (
        [Parameter(Mandatory)]
        [string]$Something
    )
    process {
        #...
    }
}

Я мог бы дать $Something параметр псевдоним или добавить проверку следующим образом:

[Alias('Thing')]
[ValidateSetAttribute('A','B','C')]
[string]$Something

Однако возможно ли это сделать с теми "системными параметрами", которые добавляются через CmdletBinding / SupportsPaging?

т.е. как бы я реализовал следующее, учитывая, что я не определяю явно First параметр?

[Alias('PageSize')]
[ValidateRange(1, 250)]
#[int]$First #This parameter exists because SupportsPaging = $true

Пытался:

[PSAlias]$FirstAlias = New-Object 'PSAlias' -ArgumentList @('PageSize', 'First', ([string].Name))
(Get-Command -Name 'Get-MyPage').Parameters['First'].Aliases.Add($FirstAlias)
(Get-Command -Name 'Get-MyPage').Parameters['First'].Aliases #this shows it's been successfully added
Get-MyPage "hello" -Skip 3 -IncludeTotalCount -PageSize 4 #this shows it doesn't work
#Get-MyPage : A parameter cannot be found that matches parameter name 'PageSize'.

(Get-Command -Name 'Get-MyPage').Parameters['First'].Aliases.Clear()
(Get-Command -Name 'Get-MyPage').Parameters['First'].Aliases.Add('PageSize')
Get-MyPage "hello" -PageSize 2 -Skip 3 -IncludeTotalCount
#Get-MyPage : A parameter cannot be found that matches parameter name 'PageSize'

(Get-Command -Name 'Get-MyPage').Parameters['First'].Attributes.Add((New-Object 'System.Management.Automation.AliasAttribute' -ArgumentList 'First'))
#Get-MyPage : A parameter cannot be found that matches parameter name 'PageSize'.

Полный код командлета, использованный для вышеуказанного

function Get-MyPage {
    [CmdletBinding(SupportsPaging = $true)]
    param (
        [Parameter(Mandatory)]
        [string]$Something
    )
    process {
        [hashtable]$splat = @{}
        if ($PSCmdlet.PagingParameters.Skip) {$splat.Add('Skip', $PSCmdlet.PagingParameters.Skip)}
        if ($PSCmdlet.PagingParameters.First -ne [System.UInt64]::MaxValue) {$splat.Add('First', $PSCmdlet.PagingParameters.First)}
        $Something.ToCharArray() | select @splat 
    }
    end {
        if ($PSCmdlet.PagingParameters.IncludeTotalCount) { $PSCmdlet.PagingParameters.NewTotalCount($Something.ToCharArray().Count, 1.0)}
    }
}

0 ответов

Другие вопросы по тегам