#powershell #parameters
Вопрос:
У меня есть сценарий powershell, который начинается с
Param([switch]$NoDownload, [switch]$NoUnpack, [switch]$NoExtract, [switch]$NoImport, [switch]$NoBackup)
и я был очень рад, потому что думал, что это обеспечит автоматическую проверку параметров. Пока однажды я не допустил ошибку и не написал:
powershell -f myscript.ps1 -NoDowload
(обратите внимание на отсутствие n), и он с радостью загрузил то, чего я не хотел.
Как я могу сообщить механизму обработки параметров powershell, что единственными допустимыми параметрами являются те, которые я явно указываю в Param
инструкции?
Ответ №1:
Добавьте CmdletBinding
атрибут в param()
блок — это заставляет PowerShell относиться к вашему сценарию/функции как к командлету, а не к «простой» функции, и он будет применять гораздо более строгую проверку привязки параметров, включая выдачу ошибок при попытке привязать несуществующее имя параметра:
[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
)