条件powershell参数

时间:2012-05-25 05:35:16

标签: function powershell parameters conditional-statements

有没有办法在powershell函数中根据某些条件(例如:如果其中一个参数不存在或为false)强制使用某些参数?

我的想法是能够以两种方式调用函数。具体示例是从sharepoint获取列表的函数 - 我应该能够使用列表相对URL(一个且唯一的参数)或者使用web url和列表显示名称来调用它(两个参数,两者都是必需的,但仅当列表相对URL是没用过。)

我希望我的问题很明确。

3 个答案:

答案 0 :(得分:12)

正如Christian所说,这可以通过ParameterSetNames完成。看一下这个例子:

function Get-MySPWeb {
    [CmdletBinding(DefaultParameterSetName="set1")]
    param (
        [parameter(ParameterSetName="set1")] $RelativeUrl,
        [parameter(ParameterSetName="set2")] $WebUrl,
        [parameter(ParameterSetName="set2", Mandatory=$true)] $DisplayName
    )
    Write-Host ("Parameter set in action: " + $PSCmdlet.ParameterSetName)
    Write-Host ("RelativeUrl: " + $RelativeUrl)
    Write-Host ("WebUrl: " + $WebUrl)
    Write-Host ("DisplayName: " + $DisplayName)

}

如果您使用-RelativeUrl Foo运行它,它将绑定到“set1”。如果在没有参数的情况下调用此函数,它也将绑定到“set1”。

注意 - 如果PowerShell v3中没有提供任何参数(使用Win8使用者预览版),它将绑定到“set1”,但是除非您添加{,否则它将在PowerShell v2中进行错误绑定{1}}到param块。感谢@ x0n获取DefaultParameterSetName提示!

如果您尝试使用两个参数值运行它,您将收到错误。

如果使用[CmdletBinding(DefaultParameterSetName="set1")]运行它,它将提示您输入DisplayName的参数值,因为它是必需参数。

答案 1 :(得分:2)

有一个更强大的选项,称为动态参数,它允许根据其他参数的值或任何其他条件动态添加参数。

您必须以不同的方式构建脚本,像往常一样声明常规参数,并包括DynamicParam块以创建动态参数,Begin块以使用动态参数初始化变量,以及一个Process块,其中包含脚本运行的代码,可以使用常规参数和Begin中初始化的变量。它像这样:

param( 
  #regular parameters here
)

DynamicParam {
  # Create a parameter dictionary
  $runtimeParams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary

  # Populate it with parameters, with optional attributes
  # For example a parameter with mandatory and pattern validation
  $attribs = New-Object  System.Collections.ObjectModel.Collection[System.Attribute]

  $mandatoryAttrib = New-Object System.Management.Automation.ParameterAttribute
  $mandatoryAttrib.Mandatory = $true
  $attribs.Add($mandatory)

  $patternAttrib = New-Object System.Management.Automation.ValidatePatternAttribute('your pattern here')
  $attribs.Add($patternAttrib)

  # create the parameter itself with desired name and type and attribs
  $param = New-Object System.Management.Automation.RuntimeDefinedParameter('ParameterName', String, $attribs)

  # Add it to the dictionary
  $runtimeParams.Add('ParameterName', $param)

  # return the dictionary
  $ruintimeParams
}

Begin {
  # If desired, move dynamic parameter values to variables
  $ParameterName = $PSBoundParameters['ParameterName']
}

Process {
  # Implement the script itself, which can use both regular an dynamic parameters
}

当然,有趣的是,您可以在DynamicParam部分和Beign部分添加条件,以根据任何内容创建不同的参数,例如其他参数值。动态参数可以有任何名称,类型(string,int,bool,object ...)属性(强制,位置,验证集...),它们是在执行脚本之前创建的,这样您就可以获得参数任何支持它的环境中的制表符完成(intellisense),如PS控制台,PS ISE或Visual Studio代码编辑器。

一个典型的例子是,使用if部分中的简单DynamicParam,根据常规参数的值创建一组不同的动态参数。

Google" powershell动态参数"有关额外信息,例如显示动态参数的帮助。例如:

答案 2 :(得分:1)

您需要使用Parameters Set naming。 您可以将exlusive参数分配给不同的参数集名称。