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

Reject parameters not in Param() statement

我有一个以

开头的 powershell 脚本
Param([switch]$NoDownload, [switch]$NoUnpack, [switch]$NoExtract, [switch]$NoImport, [switch]$NoBackup)

我很高兴,因为我认为它会提供自动参数验证。直到有一天我写错了:

powershell -f myscript.ps1 -NoDowload

(注意缺少 n),它很高兴地下载了一些我不想要的东西。

如何告诉 powershell 参数处理机制唯一有效的参数是我在 Param 语句中明确声明的参数?

CmdletBinding 属性添加到 param() 块 - 这使得 PowerShell treat your script/function like a 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 将您的 script/function 视为“高级”,即使没有 [CmdletBinding()] 属性也是如此:

param(
  [switch]$NoDownload,
  [switch]$NoUnpack,
  [switch]$NoExtract,
  [switch]$NoImport,
  [switch]$NoBackup,
  [Parameter(Mandatory = $false, DontShow = $true)]
  $DummyParameterThatTriggersCmdletBinding
)