Splatting 是干什么的
Splatting(参数展开)把一组参数放进哈希表,再用 @ 前缀一次性传给命令:命令本身保持简短,参数组可以预先构造、复用、按条件增删。它对长命令行的可读性提升非常明显,也让“参数根据环境动态变化”这类需求变得自然。位置参数还可以用数组展开。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7+ |
|---|---|
| 语法 | 哈希表前加 @:Copy-Item @opts;数组展开位置参数 @args |
| 键名规则 | 必须是目标命令真实的参数名,可带或不带短横线 |
| 常见用途 | 长命令拆行、参数由配置生成、多命令复用同一份参数 |
典型使用场景
- 长命令拆行:把十几个参数放进哈希表,命令本身一行即可
- 参数复用:同一组连接参数供多个 Cmdlet 使用
- 条件参数:按环境判断后再决定是否加入某个开关
- 脚本函数设计:把参数集合透传给内部调用
- 自动化模板:从配置文件读入参数并构造哈希表
常用示例
常用示例
# 哈希表展开:长命令可读性大幅提升
$opts = @{ Path='D:\Src'; Destination='D:\Dst'; Recurse=$true; Force=$true }
Copy-Item @opts
# 参数按条件增删
$get = @{ Path='D:\Logs'; Filter='*.log' }
if ($IncludeSub) { $get['Recurse'] = $true }
Get-ChildItem @get
# 远程调用场景复用连接参数
$session = @{ ComputerName='web01'; Port=5985 }
Invoke-Command @session -ScriptBlock { hostname }
# 数组展开位置参数
$args = 'D:\a.txt','D:\b.txt'
Get-Item @args两种展开方式
| 写法 | 展开对象 | 典型场景 |
|---|---|---|
| @hashtable | 命名参数(键=参数名) | 参数多、需要条件增删 |
| @array | 位置参数(按顺序) | 参数顺序固定的简单调用 |
| $hashtable | 不展开,直接当对象传入 | 需要传递对象本身时 |
哈希表的键名必须是目标命令真实存在的参数名。拼写错误在写法上完全合法,只有真正执行时才会报“找不到匹配的参数”,所以参数调整后一定要实跑验证。
@ 前缀只能用于变量(哈希表或数组)。写成 @{ A=1 } 直接传给命令不是 splatting,那样传的是字面量对象,会被当成一个位置参数。
把用户输入直接拼成参数键名会造成参数注入:调用者可能借机打开本不该开放的开关。参数键名应由脚本内部固定,值可以外部提供。