Выдача параметров в скрипте
Может кто-то сказать, что я делаю не так, в ниже я написал:
function set-harden {
[CmdletBinding(DefaultParameterSetName='NormalHardening')]
param (
[Parameter(ParameterSetName='DoNotRemoveFromDomain')]
[Parameter(ParameterSetName='PermitHTTP' ,Mandatory=$True)]
[Parameter(ParameterSetName='PermitHTTPS' ,Mandatory=$True)]
[switch]$DONOTRemovefromdomain,
[Parameter(ParameterSetName='PermitHTTP')]
[Parameter(ParameterSetName='DoNotRemoveFromDomain')]
[switch]$Permithttp,
[Parameter(ParameterSetName='PermitHTTPS')]
[Parameter(ParameterSetName='DoNotRemoveFromDomain')]
[switch]$Permithttps,
[Parameter(ParameterSetName='NormalHardening')]
$NormalHardening
)}
If($NormalHardening -eq ""){
Write-Host "Excellent!"
}
Все, что я хочу сделать, это позволить пользователю выбрать -DONOTRemovefromdomain
или же -Permithttp
или даже -Permithttps
, Пользователь может выбирать из множества вариантов.
Когда я запускаю это ниже, я получаю ошибку:
PS C:\Temp> set-harden -DONOTRemovefromdomain -Permithttp
set-harden : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ set-harden -DONOTRemovefromdomain -Permithttp
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [set-harden], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,set-harden
Кроме того, если я ничего не укажу (так что нужно просто перейти к параметру NormalHardening), я ничего не получу обратно:
PS C:\Temp> set-harden
PS C:\Temp>
2 ответа
Вы указали два флага, DONOTRemovefromDomain
а также Permithttp
которые принадлежат двум наборам параметров, DoNotRemoveFromDomain
а также PermitHttp
, Синтаксический анализатор команд не может узнать, какой набор параметров вы имеете в виду, поэтому вы получите ошибку.
Причина, по которой вы не получаете сообщение об ошибке, когда ничего не указываете, заключается в том, что вы явно задали для параметра по умолчанию значение NormalHardening
, Вы не установили Mandatory
Установите флажок для одного параметра в этом наборе параметров, и по умолчанию параметры не являются обязательными, поэтому вы не видите ошибку.
Вместо того, чтобы иметь все эти наборы параметров, почему бы просто не иметь 2, один для значений по умолчанию и один для всех флагов, которые вы хотите установить:
function set-harden {
[CmdletBinding(DefaultParameterSetName='NormalHardening')]
param (
[Parameter(ParameterSetName='Options')]
[switch]$DONOTRemovefromdomain,
[Parameter(ParameterSetName='Options')]
[switch]$Permithttp,
[Parameter(ParameterSetName='Options')]
[switch]$Permithttps,
[Parameter(ParameterSetName='NormalHardening')]
$NormalHardening
)}
If($PSCmdlet.ParameterSetName -eq "Options"){
Write-Host "Excellent!"
}
Как, если имя набора параметров установлено в Options
Вы можете проверить и применить флаги. Если установлено NormalHarding
тогда вы знаете, чтобы использовать $NormalHardening
параметр.
Sean дал хороший ответ о том, что происходит в вашем конкретном случае, но я хочу включить несколько советов по устранению неполадок с наборами параметров.
Получить помощь
Или, более конкретно, Get-Help
, Синтаксис набора параметров автоматически генерируется из блока param, поэтому Get-Help myFunction
покажет вам, как PowerShell интерпретирует ваши наборы параметров (сколько, какие параметры являются обязательными или нет в каждом наборе и т. д.).
Трассировка вызова
Если наборы выглядят правильно, но вы получаете ошибки и не знаете почему, позвольте PowerShell показать вам, как его параметры привязки:
Trace-Command -Name ParameterBinding -Expression { Set-Harden -Permithttp } -PSHost
Это может дать вам отличное представление о том, что происходит, и привести вас к тому, как вы могли бы это исправить (или помочь вам понять, что вы не можете).