gpt4 book ai didi

powershell - 为什么 PowerShell 的 `Get-ChildItem` 命令将参数 `d` 解析为 `Depth` ?

转载 作者:行者123 更新时间:2023-12-03 13:32:28 24 4
gpt4 key购买 nike

鉴于 Get-ChildItem具有三个以字符 D 开头的参数...

❯ (gcm Get-ChildItem).Parameters.Values |? Name -like 'd*' | select name, aliases

Name Aliases
---- -------
Depth {}
Debug {db}
Directory {ad, d}
...而 Directory参数有明确的别名 add , 为什么 Get-ChildItem -d解析为 Get-ChildItem -Depth ?
❯ Get-ChildItem -d
Get-ChildItem: Missing an argument for parameter 'Depth'. Specify a parameter of type 'System.UInt32' and try again.

最佳答案

这是因为其他参数是根据您询问的路径在调用时添加的动态参数。

  • -Directory仅在 Path 时有效位于文件系统提供程序中
  • -DnsName-DocumentEncryptionCert仅在证书提供程序中有效

  • -re 相同正在 -Recurse而不是对 -ReadOnly 模棱两可... -e也一样正在 -Exclude而不是 -Eku-ExpiriringInDays ...
    你会注意到,如果你运行 Get-ChildItem -f它会告诉你 f是模棱两可的,它建议的唯一选项是 -Filter-Force ,而不是 -File-FollowSymlink这是文件系统提供程序独有的...

    您可以使用 Get-Parameter 查看所有内容您可以通过 Install-Script Get-Parameter 从 PowerShell 库中获取

    我最终找到了一种通过实验证明非动态参数总是首先得到解决的方法,并且参数绑定(bind)器甚至从不查看动态参数以获取没有它们可以绑定(bind)的任何东西。因此,参数选择器甚至不知道 的名称是什么。或别名 的动态参数是除非在非动态参数上找不到匹配项。这样 d别名只会引起困惑,除非它的生成方式也显示在其他命令上......
    试试这个:
    using namespace System.Management.Automation
    function Test-Alias {
    [CmdletBinding()]
    param(
    [switch]$Awful
    )

    dynamicparam {
    $paramDictionary = [RuntimeDefinedParameterDictionary]::new()
    $attribs = [System.Collections.ObjectModel.Collection[System.Attribute]]::new()
    $attribs.Add([ParameterAttribute]@{ParameterSetName = "_AllParameterSets" })

    $paramdictionary.Add("Automation", [RuntimeDefinedParameter]::new( "Automation", [switch], $attribs))

    $attribs += [AliasAttribute]::new("A", "C")
    $paramdictionary.Add("Architecture", [RuntimeDefinedParameter]::new( "Architecture", [switch], $attribs))
    $paramdictionary
    }
    end {
    $PSBoundParameters
    }
    }
    如果您在控制台中运行它,您不仅可以看到 Test-Alias -A使用 Awful还有那个 Test-Alias -C确实有效! A 别名从来没有机会,但这并不是因为动态参数上的别名被完全忽略,而是因为有一个以该字母开头的参数不是动态的。
    现在试试这个:
    Trace-Command -Name ParameterBinding { Test-Alias -A } -PSHost
    A screenshot of my output, for the lazy
    并将其与使用 Test-Alias -C 时的输出进行比较或 Test-Alias -A -C ...
    您可以看到,只有在可以绑定(bind)的所有非动态参数都已完成之后,才考虑动态参数。

    关于powershell - 为什么 PowerShell 的 `Get-ChildItem` 命令将参数 `d` 解析为 `Depth` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65854641/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com