powershell参数默认值有四种设置方式:param()中直接赋值最常用;read-host动态提示适用于交互场景但禁用于自动化;$psdefaultparametervalues可会话级统一配置;结合mandatory属性与条件检查实现智能兜底。
可以在 param() 块中直接为参数变量赋值,powershell 会自动将其设为默认值——用户不提供该参数时,就用这个值。
在 Param() 中直接赋值
这是最常用、最直观的方式。语法就是在参数声明后加等号和默认值:
[string] $ComputerName = "localhost"[int] $Timeout = 30-
[switch] $VerboseOutput(开关参数本身无默认值,但存在即为$true)
注意:类型声明(如 [string])建议保留,这样 PowerShell 能自动验证输入是否可转换;若用户传入无法转成指定类型的值(比如给 [int] 传入 "abc"),脚本会报错并中止,起到输入校验作用。
用 Read-Host 动态提示输入
当没有合适的静态默认值,又不想让参数留空时,可让脚本运行时主动询问用户:
[string] $FilePath = Read-Host "请输入文件路径"[int] $Port = Read-Host "请输入端口号"
这种方式适合交互式场景。但要注意:如果脚本在非交互环境(如自动化任务、CI/CD 流水线)中运行,Read-Host 会卡住,导致超时或失败。生产脚本慎用。
用 $PSDefaultParameterValues 统一设置(高级)
这个变量适用于多次调用同一脚本或命令时,想统一省略某些重复参数。它作用于整个会话(或配置文件中持久化):
$PSDefaultParameterValues['.\MyScript.ps1:ComputerName'] = 'DC01'$PSDefaultParameterValues['Get-EventLog:LogName'] = 'Application'
关键点:
- 键的格式必须是
"命令名:参数名",脚本名要用.\xxx.ps1形式(不能用绝对路径或别名) - 只对带
[CmdletBinding()]或使用Param()的脚本生效 - 可在 PowerShell 配置文件(
$PROFILE)中写入,实现长期生效
结合必需性与默认值
有时希望参数“有默认值,但用户不提供时仍强制提示”——这时不能只靠默认值,而应配合 [Parameter(Mandatory)] 属性:
-
[Parameter(Mandatory)][string] $Name→ 用户必须提供,无默认值 -
[Parameter(Mandatory)][string] $Name = "default"→ 语法合法,但Mandatory会让默认值失效,仍要求输入
真正实用的做法是:**默认值 + 条件检查**。例如:
if (-not $PSBoundParameters.ContainsKey('ComputerName')) { $ComputerName = Read-Host "目标计算机名" }这样既保留了默认逻辑,又能在必要时兜底交互。











