多个ParameterSet中的PowerShell参数返回模糊错误

时间:2018-11-12 18:32:27

标签: powershell

我正在尝试编写PS函数,该函数应根据指定的开关参数给出激活或停用命令。

我希望在两个不同的参数集中设置$ Active和$ Inactive,但是我想用$ Active \ $ Inactive指定$ InputFile或$ Policy

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


更新18/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 :(得分:0)

以您与我们共享的示例为例,以下将是有效的参数集:

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

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

如果仅计划使用这两个参数集,并且您有一些对这两个参数均有效的参数,则实际上不需要在参数集中声明它们-除非它们的表现不同

所以您的示例可以这样写:

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

具有您定义的当前参数集。

请向您询问有关您要解决的问题的更多详细信息,以便我们为您提供帮助。

答案 1 :(得分:0)

对于更新的要求,您应该执行以下操作:

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个不同的参数集来满足您的要求。