拒绝不在Param()语句中的参数



我有一个以

开头的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
)

最新更新