在具有多个唯一开关的函数中使用高级参数集

cyborgcommando0

我正在使用Powershell 4.0。

我正在尝试编写一个cmdlet,在此cmdlet中,我想使用“高级参数集”来根据选择的参数选择某些选项。这个特定的函数本质上并最终将是Get-ADComputer,但对于某些选项预编程了-SearchBase。

我总共有6个参数。2是字符串($ ComputerName或$ IpAddress),1是整数($ OULevel)和3个开关($ ComputerOU,$ AllCompany,$ List)。

我为ComputerName和IPAddress分别设置了一个参数,我希望用户能够输入一个或另一个-我想我已经弄清楚了它很简单。但是,我希望$ OULevel,$ ComputerOU和$ AllCompany是排他性的,如果使用了一个,则不能使用另一个。$ List在每种情况下均应保持可用。

我尝试了各种参数集的变体,但都没有用。这是我的脚本现在的样子,并进行了一些修整:

    function Get-CompanyADComputer{
         [CmdletBinding(DefaultParametersetName="ComputerName")]

    Param(
        [Parameter(Mandatory=$true,
                    ParameterSetName="ComputerName",
                    Position=0,
                    ValueFromPipeline=$false,
                    HelpMessage='Enter a computer name to search in ActiveDirectory.')]
        [Alias('Computer','CN')]
        [string]$ComputerName,

        [Parameter(Mandatory=$true,
                    ParameterSetName="IPAddress",
                    Position=0,
                    ValueFromPipeline=$false,
                    HelpMessage='Enter an IP address to search in ActiveDirectory.')]
        [Alias('IPv4Address','IPv6Address')]
        [string]$IPAddress,

        [Parameter(Mandatory=$false,
                    HelpMessage='Enter a number between 0 and 8. 0 is your current OU Container.')]
        [ValidateRange(0,8)]
        [int]$OULevel = 0,

        [Parameter()]
        [Switch]$ComputerOU,

        [Parameter()]
        [Switch]$AllCompany,

        [Parameter()]
        [Switch]$List
    )

如果您好奇我们的广告是按位置,类别(计算机,用户,组,联系人等)组织的,则在下面的每个OU中它会变得更加细化。该脚本检测您计算机的OU并在此处开始搜索。$ OULevel的目的是,如果用户指定了另一个数字,则搜索将从另一个OU开始,然后进行递归搜索。$ ComputerOU的目的是使您的搜索转到默认的Computers OU,而不是整个域或您的位置。$ AllCompany的目的是使搜索默认到整个域,而不是其他任何选择或OU。

任何指导表示赞赏。如果我的脚本不知所措,我似乎无法掌握这一点。

cyborgcommando0

我在另一个论坛上问了唐·琼斯(Don Jones)这个强大的专家,他给了我我所需要的信息。他通过这样对我解释:

如果我理解这个问题,那么您基本上必须排除所有可能的组合。请记住,一个参数可以属于1+个参数集。因此,您可能有一个包含Computername和OULevel,Computername和ComputerOU以及Computername和AllCompany的集合。那是三个。然后再将这三个用于IPAddress。我知道它不是很优雅,但是请看一下Where-Object的帮助-到目前为止也不是很优雅。然后,列表将不属于集合,这意味着列表将属于所有集合。

那使我走上了正轨。因此,我实际上最终改变了cmdlet的工作方式,因此重新修改了我的答案,但是现在我知道该怎么做了,我将更新现有示例,以便我能持之以恒并希望能为您提供帮助。

    function Get-CompanyADComputer{
     [CmdletBinding(DefaultParametersetName="ComputerName")]

Param(
    [Parameter(Mandatory=$true,
                ParameterSetName="ComputerName",
                Position=0,
                ValueFromPipeline=$false,
                HelpMessage='Enter a computer name to search in ActiveDirectory.')]
    [Parameter(Mandatory=$true,
                ParameterSetName="ComputerNameOULevel",
                Position=0,
                ValueFromPipeline=$false,
                HelpMessage='Enter a computer name to search in ActiveDirectory.')]
    [Parameter(Mandatory=$true,
                ParameterSetName="ComputerNameComputerOU",
                Position=0,
                ValueFromPipeline=$false,
                HelpMessage='Enter a computer name to search in ActiveDirectory.')]
    [Parameter(Mandatory=$true,
                ParameterSetName="ComputerNameAllCompany",
                Position=0,
                ValueFromPipeline=$false,
                HelpMessage='Enter a computer name to search in ActiveDirectory.')]
    [Alias('Computer','CN')]
    [string]$ComputerName,

    [Parameter(Mandatory=$true,
                ParameterSetName="IPAddress",
                Position=0,
                ValueFromPipeline=$false,
                HelpMessage='Enter an IP address to search in ActiveDirectory.')]
    [Parameter(Mandatory=$true,
                ParameterSetName="IPAddressOULevel",
                Position=0,
                ValueFromPipeline=$false,
                HelpMessage='Enter an IP address to search in ActiveDirectory.')]
    [Parameter(Mandatory=$true,
                ParameterSetName="IPAddressComputerOU",
                Position=0,
                ValueFromPipeline=$false,
                HelpMessage='Enter an IP address to search in ActiveDirectory.')]
    [Parameter(Mandatory=$true,
                ParameterSetName="IPAddressAllCompany",
                Position=0,
                ValueFromPipeline=$false,
                HelpMessage='Enter an IP address to search in ActiveDirectory.')]
    [Alias('IPv4Address','IPv6Address')]
    [string]$IPAddress,

    [Parameter(Mandatory=$false,
                ParameterSetName="ComputerNameOULevel",
                HelpMessage='Enter a number between 0 and 8. 0 is your current OU Container.')]
    [Parameter(Mandatory=$false,
                ParameterSetName="IPAddressOULevel",
                HelpMessage='Enter a number between 0 and 8. 0 is your current OU Container.')]
    [ValidateRange(0,8)]
    [int]$OULevel = 0,

    [Parameter(ParameterSetName="ComputerNameComputerOU")]
    [Parameter(ParameterSetName="IPAddressComputerOU")]
    [Switch]$ComputerOU,

    [Parameter(ParameterSetName="ComputerNameAllCompany")]
    [Parameter(ParameterSetName="IPAddressAllCompany")]
    [Switch]$AllCompany,

    [Parameter()]
    [Switch]$List
)

由于我不希望这3个参数相互使用,因此它们必须属于自己的参数集,因此当您尝试使用一个参数时,其他参数将不会出现。这极大地帮助和简化了脚本编写过程本身。Powershell参数集没有允许脚本自身来考虑用户输入,而是消除了这些选项。

$ List参数没有参数集名称,因为我希望该参数在每种情况下都可用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

返回具有多个输入参数的函数的值以在同一类中具有多个参数的另一个函数中使用?

REST 路由 - 具有多个唯一参数的实体

如何在具有多参数函数的数据集列中使用 apply 或 vapply

重构唯一函数具有不同参数的位置

使用addEventListener在javascript中设置单独的函数参数以具有唯一的ID

在 JQ 中使用具有多个参数的 C 数学函数

PowerShell:每个参数集必须至少具有一个对该参数集唯一的参数

在 OOP Python tkinter 中的多个类中使用具有相同参数的一个函数的最佳方法是什么

使用odeint求解具有阶跃函数参数的ODE集

将 `dplyr::across` 与具有多个参数的函数一起使用

将 sapply 与具有多个参数的函数一起使用

Clojure:将过滤器与具有多个参数的函数一起使用

将 onclick 事件与模板文字中具有多个参数的函数一起使用

具有一个参数的多个变量的函数

如何在SQL查询中使用GROUP BY Clasuse显示具有多个值的唯一数据?

在Python中使用多个参数进行映射,包括一个具有默认值的参数

使用具有多个结果的函数作为参数

Haskell使用map调用具有多个参数的函数

在Google Apps脚本中使用多个高级参数

在具有多个构造函数的单个类中使用对象

最大化具有多个贡献者的唯一集之和的算法

使用Python合并2个csv数据集的公共ID列-一个csv具有多个记录以包含唯一ID

npgsql:如何在一个以集合为参数的命令中使用 npgsql 选择多行(具有多个列值)?

如何绘制具有多个参数的函数

具有多个参数的函数方差

PostgreSQL:具有多个日期参数的函数

Ninject具有多个参数的构造函数

具有多个参数的反应函数

具有多个参数的动态调用函数