powershell高级函数中位置参数与命名参数可共存互补,通过parameter(position=n)控制位置绑定,未设position的参数仅支持命名调用,混合使用时优先匹配命名参数,再按位置或声明顺序绑定剩余值。
powershell 高级函数中,位置参数和命名参数不是互斥的,而是可以共存、互补使用的。关键在于理解参数绑定机制和如何通过属性控制行为。
位置参数的定义与控制
位置参数按声明顺序接收未带名称的输入值。默认情况下,PowerShell 会尝试将第一个未命名参数绑定到第一个参数,依此类推。但你可以显式控制位置行为:
- 用 [Parameter(Position = 0)] 明确指定位置索引(从 0 开始)
- 不加
Position属性时,该参数只能通过名称传入 - 多个参数设为同一位置(如都设
Position=0)会导致冲突,不建议 - 设
Position = -1表示该参数不参与位置绑定,仅支持命名方式
命名参数的显式声明
只要参数有名字,就天然支持命名调用。高级函数中推荐始终使用 param 块并显式命名:
- 调用时写
-ComputerName "srv01"即为命名参数传入 - 命名参数不依赖顺序,可任意排列:
-Timeout 60 -ComputerName "srv01" - 即使参数设了
Position,仍可同时接受命名调用 - 命名参数名区分大小写不敏感(
-computername和-ComputerName等效)
混合使用时的绑定优先级
当一个函数同时支持位置和命名参数,PowerShell 按以下规则解析输入:
- 先匹配已明确指定名称的参数(如
-Path、-Recurse) - 剩余未命名的值,再按
Position属性或声明顺序依次绑定 - 如果某参数同时标记
Mandatory=$true且无默认值,又未被命名或位置匹配,则报错 - 管道输入(
ValueFromPipeline或ValueFromPipelineByPropertyName)会在 process 块中单独处理,不干扰命令行位置/命名逻辑
实际写法示例
下面是一个兼顾位置与命名调用的典型高级函数结构:
function Get-ServerStatus {[CmdletBinding()]
param(
[Parameter(Mandatory, Position = 0)]
[string]$ComputerName,
[Parameter(Position = 1)]
[int]$Port = 5985,
[Parameter(Mandatory, ValueFromPipelineByPropertyName)]
[string]$Domain,
[switch]$UseSSL
)
process { Write-Host "$ComputerName : $Port ($Domain)" }
}
它支持:
• Get-ServerStatus "dc01" 443 -Domain "contoso.com"(位置+命名混合)
• Get-ServerStatus -ComputerName "dc01" -Port 443 -Domain "contoso.com"(全命名)
• 也可从管道接收含 ComputerName 和 Domain 属性的对象











