Отклонить параметры, не указанные в инструкции Param()

#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
)