PowerShell中Get-LocalUser不加-Name参数也可正常运行的原因是什么?
PowerShell 无命名参数自动匹配原理
这个现象是PowerShell内置的位置参数绑定机制决定的,核心逻辑如下:
- 每个PowerShell cmdlet的所有参数都预定义了元数据属性,其中
Position属性用来标记该参数是否支持「不用写参数名,按传入顺序匹配值」。你可以执行Get-Command Get-LocalUser -Syntax查看该命令的语法定义,输出的第一组参数集为:
这里Get-LocalUser [[-Name] <String[]>] [<CommonParameters>]-Name参数被两层方括号包裹,除了代表该参数是可选参数外,还意味着它支持位置绑定,位置序号为0(即第一个传入的无命名参数会优先绑定到该参数)。 - 你可以通过以下命令验证Name参数的位置属性:
输出的(Get-Command Get-LocalUser).Parameters['Name'].Attributes | Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] } | Select-Object PositionPosition值为0,确认它是首个位置参数。 - 该命令的其他参数(比如
-SID、-InputObject等)的Position属性默认被设为Named,也就是必须显式指定参数名才能传值,不会和位置参数争抢传入的John值。 - PowerShell参数绑定的优先级规则为:先匹配显式指定的命名参数,再按顺序匹配位置参数,最后才尝试管道绑定等其他绑定逻辑,所以你传入的无命名值只会匹配到对应位置的参数上。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

