Выдача параметров в скрипте

Может кто-то сказать, что я делаю не так, в ниже я написал:

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

Это может дать вам отличное представление о том, что происходит, и привести вас к тому, как вы могли бы это исправить (или помочь вам понять, что вы не можете).

Другие вопросы по тегам