灵活运用ParameterSetName于多种使用场景

 PowerShell 中许多 cmdlet 都支持大量的参数集。我们用 Get-Help 去查看相应的 cmdlet 时就能看到参数集。

例如,我们使用Get-Help Get-Process在查看使用语句用法,显示结果如下:

 Get-Process  
  
SYNTAX  
    Get-Process [[-Name] <string[]>] [-ComputerName <string[]>] [-Module] [-FileVersionInfo]  [<CommonParameters>]  
  
    Get-Process [[-Name] <string[]>] -IncludeUserName  [<CommonParameters>]  
  
    Get-Process -Id <int[]> [-ComputerName <string[]>] [-Module] [-FileVersionInfo]  [<CommonParameters>]  
  
    Get-Process -Id <int[]> -IncludeUserName  [<CommonParameters>]  
  
    Get-Process -InputObject <Process[]> [-ComputerName <string[]>] [-Module] [-FileVersionInfo]  [<CommonParameters>]  
  
    Get-Process -InputObject <Process[]> -IncludeUserName  [<CommonParameters>]  

我们可以看到Get-Process有多种的使用方法正是因为使用到了多种的参数集。

对于熟悉PowerShell的朋友来说,在编写高级函数时,我们经常会设置参数集,我们今天正是要来再次探讨下关于参数集的使用。

我们先从下面这个列子说起吧。

Function Get-Somthing  
{  
    [CmdletBinding()]  
    Param  
    (  
        [Parameter(ParameterSetName='List1')][String]$apple,  
        [Parameter(ParameterSetName='List1')][String]$orange,  
        [Parameter(ParameterSetName='List1')][String]$mango,  
  
        [Parameter(ParameterSetName='List2')][String]$water,  
        [Parameter(ParameterSetName='List2')][String]$milk,  
        [Parameter(ParameterSetName='List2')][String]$juice,  
  
        [Parameter(ParameterSetName='List3')][String]$phone,  
        [Parameter(ParameterSetName='List3')][String]$computer,  
        [Parameter(ParameterSetName='List3')][String]$camera,  
  
        [Parameter()][String]$boy,  
        [Parameter()][String]$girl  
    )  
}
在编写好如上列子后,我们一般会使用下面的方式去调用方法。 

Get-Somthing -apple "one" -orange "one" -boy "eat"  
Get-Somthing -water "one" -juice "one" -girl "eat"  
Get-Somthing -computer "one" -camera "one" -boy "eat" 

由此可以看出,采用了参数集后,我们调用的参数必须是归纳在相同的参数集名称范围里的参数,而没有设定参数集的参数则可以和任何参数及的成员搭配。

我们再来看看下面没有正确使用参数集的例子:

Get-Somthing -apple "one" -phone "two"  
Get-Somthing -boy "23" -girl "21"  

第一个例子,很明显两个参数,apple与phone存在于不同的参数集,自然是不正确的。但是奇怪的是第二个例子也依然是不正确的用法。因为boy与girl参数不隶属于任何参数集,也代表他们可以和任何参数集的成员一起使用,而PowerShell是不知道你到底想使用哪一个参数成员。

另外,在定义参数集时,我们不能重复把一个参数成员定义在不同的参数集下面。如下面的例子,同一个变量不能重复定义在超过一个以上的参数集。

Function Get-Somthing  
{  
    [CmdletBinding()]  
    Param  
    (  
        [Parameter(ParameterSetName='List1')][String]$apple,  
        [Parameter(ParameterSetName='List1')][String]$orange,  
        [Parameter(ParameterSetName='List1')][String]$mango,  
  
        [Parameter(ParameterSetName='List2')][String]$apple,  
        [Parameter(ParameterSetName='List2')][String]$milk,  
        [Parameter(ParameterSetName='List2')][String]$juice  
    )  
}  
但是我们可以让一个变量成员隶属于多个参数集,就像下面这个样子:
Function Get-Somthing  
{  
    [CmdletBinding()]  
    Param  
    (  
        [Parameter(ParameterSetName='List1')][String]$apple,  
        [Parameter(ParameterSetName='List1')][String]$orange,  
        [Parameter(ParameterSetName='List1')][String]$mango,  
  
        [Parameter(ParameterSetName='List2')][String]$water,  
        [Parameter(ParameterSetName='List2')][String]$milk,  
        [Parameter(ParameterSetName='List2')][String]$juice,  
  
        [Parameter(ParameterSetName='List3')][String]$phone,  
        [Parameter(ParameterSetName='List3')][String]$computer,  
        [Parameter(ParameterSetName='List3')][String]$camera,  
  
        [Parameter(ParameterSetName='List1')]  
        [Parameter(ParameterSetName='List2')]  
        [String]$car,  
  
        [Parameter()][String]$boy,  
        [Parameter()][String]$girl  
    )  
}  
使用的时候就可以是:
Get-Somthing -apple "one" -car "20"  
Get-Somthing -milk "one" -car "20" 
让我们回过头再次使用Get-Help Get-Somthing命令时会得到如下:

NAME  
    Get-Somthing  
      
SYNTAX  
    Get-Somthing [-apple <string>] [-orange <string>] [-mango <string>] [-car <string>] [-boy <string>] [-girl <string  
    >]  [<CommonParameters>]  
      
    Get-Somthing [-water <string>] [-milk <string>] [-juice <string>] [-car <string>] [-boy <string>] [-girl <string>]  
      [<CommonParameters>]  
      
    Get-Somthing [-phone <string>] [-computer <string>] [-camera <string>] [-boy <string>] [-girl <string>]  [<CommonP  
    arameters>]  

就像开场白所说的那样,你在帮助里看到的使用语法正是我们使用了参数集的作用。

最后在提一点,你甚至可以设置默认参数集,像这样[CmdletBinding(DefaultParameterSetName='List3')],当你再次使用Get-Help Get-Somthing命令时,默认第一条使用的语句方法,正是你设置的默认参数集。

NAME  
    Get-Somthing  
      
SYNTAX  
    Get-Somthing [-phone <string>] [-computer <string>] [-camera <string>] [-boy <string>] [-girl <string>]  [<CommonParameters>]  
      
    Get-Somthing [-apple <string>] [-orange <string>] [-mango <string>] [-car <string>] [-boy <string>] [-girl <string>]  [<CommonParameters>]  
      
    Get-Somthing [-water <string>] [-milk <string>] [-juice <string>] [-car <string>] [-boy <string>] [-girl <string>]  [<CommonParameters>]  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值