$psdefaultparametervalues 是会话级哈希表变量,用于为 cmdlet 或高级函数的参数设置默认值,键为“命令名:参数名”格式,值可为静态值或脚本块,支持动态生成和持久化配置。
在 powershell 中,$psdefaultparametervalues 是一个首选项变量,用来为特定 cmdlet、高级函数或脚本的参数设置**会话级默认值**。它不修改命令本身,而是在你调用命令时自动填充未显式指定的参数值——前提是该命令使用了 cmdletbinding 属性(绝大多数内置 cmdlet 和自定义高级函数都满足)。
基本语法和键值对格式
该变量本质是一个经过类型强化的哈希表(DefaultParameterDictionary),键必须是 CommandName:ParameterName 格式,值可以是普通对象或脚本块:
-
键:命令名必须与
Get-Command返回的名称一致(例如Get-ChildItem,不能写别名如gci) -
值:支持静态值(如字符串、数字)或
{ ... }形式的脚本块;若参数本身需接收脚本块(如Invoke-Command -ScriptBlock),则需双层大括号:{{ Get-Date }}
常见实用设置示例
比如你总希望 Format-Table 自动换行、Get-ChildItem 默认递归、Out-File 默认用 UTF8 编码:
$PSDefaultParameterValues = @{
'Format-Table:Wrap' = $true
'Get-ChildItem:Recurse' = $true
'Out-File:Encoding' = 'UTF8'
}
之后执行 Get-Service | Format-Table Name,Status 就等效于加了 -Wrap;Get-ChildItem . 自动包含子目录。
动态值:用脚本块生成上下文相关默认值
值设为脚本块时,每次调用都会重新执行,可访问当前作用域变量或运行时信息:
-
'Send-MailMessage:From' = { "$env:USERNAME@company.com" }—— 每次发信自动填发件人 -
'Invoke-Command:ComputerName' = { (Get-Content servers.txt) }—— 从文件读取目标主机列表
持久化与管理技巧
该设置仅对当前会话有效。要长期生效,需写入 PowerShell 配置文件(如 $PROFILE):
# 添加到 $PROFILE 后,每次启动 PowerShell 都加载 $PSDefaultParameterValues['Out-File:Encoding'] = 'UTF8'
运行时增删改推荐用方法而非直接赋值,避免覆盖已有设置:
- 添加:
$PSDefaultParameterValues.Add('Get-Process:IncludeUserName', $true) - 删除:
$PSDefaultParameterValues.Remove('Format-Table:Wrap') - 修改:
$PSDefaultParameterValues['Out-File:Encoding'] = 'UTF8BOM'
不复杂但容易忽略。











