首页/系统/Windows 运维速查/Splatting 参数展开
PowerShell 基础66 条

Splatting 参数展开

把参数字典/数组用 @ 前缀展开为命令参数,让长命令更可读,也支持动态生成参数。

Windows 运维速查系统更新于 2026-10-13

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,那样传的是字面量对象,会被当成一个位置参数。
把用户输入直接拼成参数键名会造成参数注入:调用者可能借机打开本不该开放的开关。参数键名应由脚本内部固定,值可以外部提供。

易错点

  • 键名写错:语法合法但运行时才报错,脚本在没人盯着的时段失败
  • 对字面量用 @:误以为写了 @ 就是 splatting,实际把哈希表当成一个参数传了进去
  • 数组展开位置参数顺序错位:位置参数含义变化后结果静默错误
  • 把 splatting 当万能:复杂参数校验仍需在脚本里显式做,不能依赖展开
  • 键名由外部输入决定:形成参数注入,绕过脚本设计的安全边界

数据来源与参考

  • Microsoft Learn:about_Splatting

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌