Параметр PowerShell в нескольких ParameterSet возвращает неоднозначную ошибку - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь написать функцию PS, которая должна давать команду активировать или деактивировать в зависимости от указанного параметра переключателя.

Я хочу $ Active и $ Inactive в двух разных наборах параметров, но я хочууказать $ InputFile или $ Policy с помощью $ Active \ $ Inactive

function ModifyState (
    [Parameter(Mandatory=$false,ParameterSetName="A")]
    [Parameter(Mandatory=$false,ParameterSetName="I")]
    [string]$InputFile,
    [Parameter(Mandatory=$false,ParameterSetName="A")]
    [Parameter(Mandatory=$false,ParameterSetName="I")]
    [string]$Object,
    [Parameter(Mandatory=$false,ParameterSetName="A")]
    [switch]$Active,
    [Parameter(Mandatory=$false,ParameterSetName="I")]
    [switch]$Inactive

) {
    switch ($PsCmdlet.ParameterSetName) {
    "A" {
        if ($InputFile) {
            foreach ($obj in (gc $InputFile)) {
                write-host "Activate $obj"
            }
        }
        else {write-host "Activate $Object"}
    }
    "I" {
        if ($InputFile) {
            foreach ($obj in (gc $InputFile)) {
                write-host "Deactivate $obj"
            }
        }
        else {write-host "Deactivate $Object"}
    }
    }

Когда я запускаю команду без указания параметров или когда я задаю «слишком много параметров», я получаю ошибку о неоднозначном наборе параметров.

Команда:

ModifyState -InputFile .\temp.txt -Inactive -Active

Ошибка:

ModifyState : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ ModifyState -InputFile .\temp.txt -Inactive -Active
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ModifyState], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,ModifyState

Вопрос 1. Правильно ли задан код параметров?

Вопрос 2. Есть ли способ вернуть значение по умолчанию?сообщение при наличии неоднозначности набора параметров?

Надеюсь, что все было ясно и спасибо заранее

db


Обновление 13/11/18 Это примерыКоманды, которые я хочу дать:

#Parameterset "I"
ModifyState -Object PARAMVALUE -Inactive
or
ModifyState -InputFile PARAMVALUE -Inactive

#Parameterset "A"
ModifyState -Object PARAMVALUE -Active
or
ModifyState -InputFile PARAMVALUE -Active

-Active и -Inactive не должны передаваться одновременно.Также -InputFile и -Object не должны указываться одновременно.

db

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

С обновленными требованиями вы должны делать что-то вроде этого:

function ModifyState (
    [Parameter(Mandatory = $false, ParameterSetName = "Active-File")]
    [Parameter(Mandatory = $false, ParameterSetName = "Inactive-File")]
    [string]$InputFile,
    [Parameter(Mandatory = $false, ParameterSetName = "Active-Object")]
    [Parameter(Mandatory = $false, ParameterSetName = "Inactive-Object")]
    [string]$Object,
    [Parameter(Mandatory = $false, ParameterSetName = "Active-File")]
    [Parameter(Mandatory = $false, ParameterSetName = "Active-Object")]
    [switch]$Active,
    [Parameter(Mandatory = $false, ParameterSetName = "Inactive-File")]
    [Parameter(Mandatory = $false, ParameterSetName = "Inactive-Object")]
    [switch]$Inactive
) {
    switch ($PsCmdlet.ParameterSetName) {
        "A" {
            if ($InputFile) {
                foreach ($obj in (gc $InputFile)) {
                    write-host "Activate $obj"
                }
            }
            else {write-host "Activate $Object"}
        }
        "I" {
            if ($InputFile) {
                foreach ($obj in (gc $InputFile)) {
                    write-host "Deactivate $obj"
                }
            }
            else {write-host "Deactivate $Object"}
        }
    }
}

Объяснение За исключением исключений между параметрами «объект» и «активными» параметрами, вам потребуется 4 различных набора параметров для выполнения ваших требований.

0 голосов
/ 12 ноября 2018

С вашим примером, которым вы поделились с нами, следующие допустимые наборы параметров будут:

#Parameterset "I"
ModifyState -InputFile PARAMVALUE -Object PARAMVALUE -Inactive

#Parameterset "A"
ModifyState -InputFile PARAMVALUE -Object PARAMVALUE -Active

Если вы планируете использовать только эти 2 набора параметров, и у вас есть некоторые параметры, которые должны быть действительны для обоих, вы на самом делене нужно объявлять их в наборах параметров - если только они не будут вести себя по-другому .

Так что ваш пример может быть написан так:

function ModifyState (    
    [string]$InputFile,    
    [string]$Object,
    [Parameter(Mandatory = $false, ParameterSetName = "A")]
    [switch]$Active,
    [Parameter(Mandatory = $false, ParameterSetName = "I")]
    [switch]$Inactive) {
    switch ($PsCmdlet.ParameterSetName) {
        "A" {
            if ($InputFile) {
                foreach ($obj in (gc $InputFile)) {
                    write-host "Activate $obj"
                }
            }
            else {write-host "Activate $Object"}
        }
        "I" {
            if ($InputFile) {
                foreach ($obj in (gc $InputFile)) {
                    write-host "Deactivate $obj"
                }
            }
            else {write-host "Deactivate $Object"}
        }
    }
}

Если вы планируетепри выполнении вашей функции без каких-либо параметров вам необходимо предоставить раздел [CmdletBinding(DefaultParameterSetName = 'Default')] и указать значения параметров по умолчанию.

function ModifyState {
    [CmdletBinding(DefaultParameterSetName = 'A')]
    param(
        [string]$InputFile = "Filepath",
        [string]$Object,
        [Parameter(Mandatory = $false, ParameterSetName = "A")]
        [switch]$Active = [switch]::Present,
        [Parameter(Mandatory = $false, ParameterSetName = "I")]
        [switch]$Inactive) {
        switch ($PsCmdlet.ParameterSetName) {
            "A" {
                if ($InputFile) {
                    foreach ($obj in (gc $InputFile)) {
                        write-host "Activate $obj"
                    }
                }
                else {write-host "Activate $Object"}
            }
            "I" {
                if ($InputFile) {
                    foreach ($obj in (gc $InputFile)) {
                        write-host "Deactivate $obj"
                    }
                }
                else {write-host "Deactivate $Object"}
            }
        }
    }
}

Это позволит вам запустить функцию без параметров.Параметр -Active всегда будет установлен, а параметр -InputFile всегда будет указывать на файл, который вы указали в качестве значения по умолчанию.

Имея все это на месте - чего вы ожидаете от ModifyState -InputFile .\temp.txt -Inactive -Active?

Либо вы должны использовать:

ModifyState -InputFile .\temp.txt -Inactive

или

ModifyState -InputFile .\temp.txt -Active

с текущими наборами параметров, которые вы определили.

Пожалуйста, уточните свой вопрос с более подробной информацией о том, что вы пытаетесь решить, чтобы мы могли помочь вам на вашем пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...