拒绝不在 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
)
我有一个以
开头的 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
)