一个开关需要一个参数,另一个需要两个参数

时间:2017-02-01 21:43:54

标签: powershell

我有以下参数定义。在此脚本中,我必须拥有用户的访问ID,访问密钥和帐户名称。我还必须拥有设备ID,设备名称或显示名称。最后,我要求包含一个或多个属性名称和相关值。

该脚本使用此信息将属性名称和值添加到设备(在我们的监视系统中)。现在,我需要添加对删除设备的支持,但我无法弄清楚如何更改参数定义。

我正在考虑使用[switch]来确定用户是想添加还是删除属性。如果用户在运行脚本时包含-Add开关,那么我将同时需要$ PropertyNames和$ PropertyValues。如果它们包含-Delete,那么我只需要$ PropertyName。

实现这一目标的最佳方法是什么?有一个名为“Operation”的参数会更好,它会采用“Add”或“Delete”,然后将PropertyName / Values需求基于$ Operation的值吗?

感谢。代码段如下:

[CmdletBinding(DefaultParameterSetName=’Default’)]
    Param (
        [Parameter(Mandatory=$True, ParameterSetName=’Default’)]
        [Parameter(Mandatory=$True, ParameterSetName=’NameFilter’)]
        [Parameter(Mandatory=$True, ParameterSetName=’IPFilter’)]
        [string]$AccessId,
        [Parameter(Mandatory=$True, ParameterSetName=’Default’)]
        [Parameter(Mandatory=$True, ParameterSetName=’NameFilter’)]
        [Parameter(Mandatory=$True, ParameterSetName=’IPFilter’)]
        [string]$AccessKey,
        [Parameter(Mandatory=$True, ParameterSetName=’Default’)]
        [Parameter(Mandatory=$True, ParameterSetName=’NameFilter’)]
        [Parameter(Mandatory=$True, ParameterSetName=’IPFilter’)]
        [string]$AccountName,
        [Parameter(Mandatory=$True,ParameterSetName=’Default’)]
        [int]$DeviceId,
        [Parameter(Mandatory=$True,ParameterSetName=’NameFilter’)]
        [string]$DeviceDisplayName,
        [Parameter(Mandatory=$True,ParameterSetName=’IPFilter’)]
        [string]$DeviceName,
        [Parameter(Mandatory=$True, ParameterSetName=’Default’)]
        [Parameter(Mandatory=$True, ParameterSetName=’NameFilter’)]
        [Parameter(Mandatory=$True, ParameterSetName=’IPFilter’)]
        [string[]]$PropertyNames,
        [Parameter(Mandatory=$True, ParameterSetName=’Default’)]
        [Parameter(Mandatory=$True, ParameterSetName=’NameFilter’)]
        [Parameter(Mandatory=$True, ParameterSetName=’IPFilter’)]
        [string[]]$PropertyValues,
        [switch]$WriteLog,
        [string]$LogPath
    )

1 个答案:

答案 0 :(得分:2)

如果参数在所有参数集中都可用,则您不需要为每个参数设置单独的[Parameter()]属性,除非它们需要不同集合中的唯一属性。

可以按照您想要的方式使用开关,您需要将其与所有其他组进行多路复用。因此,如果您现在拥有的3套中的每一套都可用于-Add-Remove方案,那么您现在将使用6种不同的参数集。

function Invoke-Thing {
[CmdletBinding(DefaultParameterSetName='DefaultAdd')]
    Param (
        [Parameter(Mandatory=$True)]
        [string]$AccessId,

        [Parameter(Mandatory=$True)]
        [string]$AccessKey,

        [Parameter(Mandatory=$True)]
        [string]$AccountName,

        [Parameter(Mandatory=$True,ParameterSetName='DefaultAdd')]
        [Parameter(Mandatory=$True,ParameterSetName='DefaultRemove')]
        [int]$DeviceId,

        [Parameter(Mandatory=$True,ParameterSetName='NameFilterAdd')]
        [Parameter(Mandatory=$True,ParameterSetName='NameFilterRemove')]
        [string]$DeviceDisplayName,

        [Parameter(Mandatory=$True,ParameterSetName='IPFilterAdd')]
        [Parameter(Mandatory=$True,ParameterSetName='IPFilterRemove')]
        [string]$DeviceName,

        [Parameter(Mandatory=$True)]
        [string[]]$PropertyNames,

        [Parameter(Mandatory=$True, ParameterSetName='DefaultAdd')]
        [Parameter(Mandatory=$True, ParameterSetName='NameFilterAdd')]
        [Parameter(Mandatory=$True, ParameterSetName='IPFilterAdd')]
        [string[]]$PropertyValues,

        [switch]$WriteLog,
        [string]$LogPath ,

        [Parameter(Mandatory=$True, ParameterSetName='DefaultAdd')]
        [Parameter(Mandatory=$True, ParameterSetName='NameFilterAdd')]
        [Parameter(Mandatory=$True, ParameterSetName='IPFilterAdd')]
        [switch]$Add ,

        [Parameter(Mandatory=$True, ParameterSetName='DefaultRemove')]
        [Parameter(Mandatory=$True, ParameterSetName='NameFilterRemove')]
        [Parameter(Mandatory=$True, ParameterSetName='IPFilterRemove')]
        [switch]$Remove
    )

}

这里显示的是Get-Help输出:

NAME
    Invoke-Thing

SYNTAX
    Invoke-Thing -AccessId <string> -AccessKey <string> -AccountName <string> -DeviceId <int> -PropertyNames <string[]> -PropertyValues <string[]> -Add [-WriteLog] [-LogPath <string>]  [<CommonParameters>]

    Invoke-Thing -AccessId <string> -AccessKey <string> -AccountName <string> -DeviceId <int> -PropertyNames <string[]> -Remove [-WriteLog] [-LogPath <string>]  [<CommonParameters>]

    Invoke-Thing -AccessId <string> -AccessKey <string> -AccountName <string> -DeviceDisplayName <string> -PropertyNames <string[]> -Remove [-WriteLog] [-LogPath <string>]  [<CommonParameters>]

    Invoke-Thing -AccessId <string> -AccessKey <string> -AccountName <string> -DeviceDisplayName <string> -PropertyNames <string[]> -PropertyValues <string[]> -Add [-WriteLog] [-LogPath <string>]  [<CommonParameters>]

    Invoke-Thing -AccessId <string> -AccessKey <string> -AccountName <string> -DeviceName <string> -PropertyNames <string[]> -Remove [-WriteLog] [-LogPath <string>]  [<CommonParameters>]

    Invoke-Thing -AccessId <string> -AccessKey <string> -AccountName <string> -DeviceName <string> -PropertyNames <string[]> -PropertyValues <string[]> -Add [-WriteLog] [-LogPath <string>]  [<CommonParameters>]


ALIASES
    None


REMARKS
    None