首页/系统/Windows 运维速查/脚本参数 param 块
PowerShell 基础66 条

脚本参数 param 块

脚本开头声明参数:类型约束、默认值、必填与白名单,让脚本像 cmdlet 一样规范可用。

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

语法是干什么的

param 块让脚本像内置 cmdlet 一样接收参数:可声明类型、默认值、是否必填、参数位置与取值白名单,还能附带帮助文本。规范化的参数声明等于给脚本定义了接口,参数不合规会在执行前直接报错,而不是跑到中途才失败。

校验的边界在哪

ValidateSet 只覆盖取值枚举,类型约束只保证能完成转换;更复杂的业务规则(路径必须存在、日期必须在未来、数值不能越界)要在 param 之后显式校验并抛出明确错误。把校验失败当作可预期的错误路径处理,脚本在计划任务里才不会被静默跳过。

基本信息

适用平台PowerShell 2.0 及以后,高级参数属性需 2.0+
语法param([Parameter(Mandatory=$true)][string]$Path, [ValidateSet('Daily','Weekly')][string]$Mode = 'Daily')
常用属性Mandatory 必填、Position 位置参数、ValidateSet 白名单、HelpMessage 提示
位置要求必须是脚本第一条可执行语句;函数版写在 function 后的大括号内

典型使用场景

  • 脚本要给不同环境传路径与开关,用参数替代写死在文件里
  • 限定参数取值范围,避免拼错值导致静默走错分支
  • 计划任务调用脚本时传入固定参数,参数声明即接口契约
  • 给常用参数配默认值,日常调用不必每次写全
  • 通过 HelpMessage 提供帮助文本,降低同事的使用门槛

常用示例

常用示例
param(
  [Parameter(Mandatory=$true)][string]$Path,               # 必填路径
  [ValidateSet('Daily','Weekly')][string]$Mode = 'Daily',  # 白名单,默认 Daily
  [int]$RetainDays = 7                                     # 带默认值的数值参数
)
Write-Host "路径=$Path 模式=$Mode 保留=$RetainDays 天"
# 调用:.\task.ps1 -Path D:\data -Mode Weekly -RetainDays 14

常用属性读法

属性作用注意
Mandatory声明参数必填未提供时会交互提示,无人值守场景会挂起
Position允许按位置传参位置参数过多会降低可读性
ValidateSet限定可选值集合取值不在集合内直接报错
ValidateRange限定数值范围适用于重试次数、保留天数等
HelpMessage参数帮助文本配合 Get-Help 显示
类型约束如 [string]、[int]类型不匹配会在执行前失败
param 必须是脚本的第一条可执行语句:注释可以放在它前面,但任何可执行代码都会触发“不是第一条语句”的报错。
Mandatory 参数在无人值守环境下会挂起等待输入,计划任务脚本应显式传参,并在入口先做参数校验再执行业务逻辑。

易错点

  • param 前出现可执行代码会报不是第一条语句,注释可以但代码不行
  • Mandatory 参数缺省时脚本挂起等待输入,自动化任务会一直卡住
  • 只声明 [string] 而不用 ValidateSet,拼错的取值会静默走进错误分支
  • 位置参数与命名参数混用过多,调用方可读性下降且容易传错值

数据来源与参考

  • Microsoft Learn:about_Functions_Advanced_Parameters

相关工具

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