我有一个以
开头的powershell脚本Param([switch]$NoDownload, [switch]$NoUnpack, [switch]$NoExtract, [switch]$NoImport, [switch]$NoBackup)
,我很高兴,因为我认为它将提供自动参数验证。直到有一天我写错了:
powershell -f myscript.ps1 -NoDowload
(注意缺少n)),它很高兴地下载了一些我不希望它下载的东西。
我如何告诉powershell参数处理机制,唯一有效的参数是我在Param
语句中显式声明的那些?
将CmdletBinding
属性添加到param()
块中-这使PowerShell将您的脚本/函数视为cmdlet -而不是简单的"函数-并且它将应用更严格的参数绑定验证,包括在尝试绑定不存在的参数名称时抛出错误:
[CmdletBinding()]
param(
[switch]$NoDownload,
[switch]$NoUnpack,
[switch]$NoExtract,
[switch]$NoImport,
[switch]$NoBackup
)
PS ~> .myScript.ps1 -NoDowload
myScript.ps1 : A parameter cannot be found that matches parameter name 'NoDowload'.
At line:1 char:16
+ .myScript.ps1 -NoDowload
+ ~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [myScript.ps1], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : NamedParameterNotFound,myScript.ps1
为任何已定义的参数添加显式的[Parameter()]
属性也将隐式地使PowerShell将您的脚本/函数视为"高级",即使在没有[CmdletBinding()]
属性的情况下:
param(
[switch]$NoDownload,
[switch]$NoUnpack,
[switch]$NoExtract,
[switch]$NoImport,
[switch]$NoBackup,
[Parameter(Mandatory = $false, DontShow = $true)]
$DummyParameterThatTriggersCmdletBinding
)