Position属性定义参数位置绑定顺序,用[Parameter(Position=n)]声明,n从0开始;未标记者仅支持命名传参;位置参数须在命名参数之后,绑定时按数值升序匹配剩余值。
powershell 中的 position 属性用于定义参数是否支持位置绑定,以及它在命令行中按第几个位置接受值。它不改变参数本身的逻辑顺序,而是告诉 powershell:“当用户省略参数名时,这个值应该赋给哪个参数”。关键在于声明时指定位置编号,而非调用时控制顺序。
在函数或脚本中声明 Position 参数
使用 [Parameter(Position = n)] 属性修饰参数,其中 n 是从 0 开始 的整数(即第一个位置是 0,第二个是 1,依此类推)。该参数必须是可选或强制的,且不能与其他位置参数冲突。
- Position 值越小,优先级越高;若多个参数都设了 Position,但未提供足够参数值,PowerShell 按位置序号从小到大尝试绑定
- 同一函数中,不同参数的 Position 值不能重复,否则报错
- 未标记 Position 的参数只能通过名称传入(如
-Name "abc"),不能靠位置省略
位置绑定的实际行为
PowerShell 绑定位置参数时,会先处理显式命名的参数(如 -Path "C:\"),再把剩余未绑定的值,按它们在命令行中出现的顺序,依次匹配函数中声明了 Position 且尚未绑定的参数(按 Position 数值升序)。
- 例如函数定义:
[Parameter(Position=0)] $Name, [Parameter(Position=1)] $Age - 执行
Get-User "Alice" 30→$Name="Alice",$Age=30 - 执行
Get-User -Age 25 "Bob"→$Age=25(已命名),$Name="Bob"(剩下唯一未绑定值,匹配 Position=0) - 执行
Get-User "Charlie"→ 只填了 Position=0,$Age若非强制则为$null或默认值
常见错误与注意事项
Position 不是“强制按序传参”的开关,而是一种简化输入的辅助机制。滥用容易引发歧义和维护困难。
- 避免给多个参数设相同 Position;也不建议对复杂、易混淆的参数(如两个字符串路径)都开放位置绑定
- 若参数有默认值或设为
Mandatory=$true,Position 仅影响“如何传”,不影响“是否必须传” - 调用时混用命名和位置参数是允许的,但位置参数必须出现在所有命名参数之后,否则 PowerShell 可能解析失败
- 使用
Get-Help 函数名 -Full可查看帮助中是否显示 “Position?” 字段,确认该参数是否支持位置绑定
一个完整示例
以下函数接受名字(位置 0)、年龄(位置 1)、城市(仅命名):
function Get-Person {[CmdletBinding()]
param(
[Parameter(Position=0, Mandatory=$true)] [string]$Name,
[Parameter(Position=1)] [int]$Age,
[Parameter()] [string]$City
)
"Name: $Name, Age: $Age, City: $City"
}
-
Get-Person "Tom" 28 -City "Shanghai"→ 正常输出 -
Get-Person -City "Beijing" "Jerry"→ 仍可运行($Name通过位置补上),但可读性差,不推荐 -
Get-Person "Lisa"→$Age为空,$City为空,无报错


















