语法是干什么的
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 参数在无人值守环境下会挂起等待输入,计划任务脚本应显式传参,并在入口先做参数校验再执行业务逻辑。