有没有办法在 PowerShell 函数中根据某些条件(例如,如果其中一个参数不存在或为假)强制使用某些参数?
我的想法是能够以两种方式调用函数。一个具体的例子是一个从 SharePoint 获取列表的函数 - 我应该能够使用列表的相对 URL(一个也是唯一的参数)或使用 Web URL 和列表显示名称(两个参数,都是必需的,但是仅当不使用列表相对 URL 时)。
有没有办法在 PowerShell 函数中根据某些条件(例如,如果其中一个参数不存在或为假)强制使用某些参数?
我的想法是能够以两种方式调用函数。一个具体的例子是一个从 SharePoint 获取列表的函数 - 我应该能够使用列表的相对 URL(一个也是唯一的参数)或使用 Web URL 和列表显示名称(两个参数,都是必需的,但是仅当不使用列表相对 URL 时)。
正如 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(带有 Windows 8 消费者预览版)中未提供任何参数时,它将绑定到“set1”,但是除非您添加[CmdletBinding(DefaultParameterSetName="set1")]
到参数块,否则它将在 PowerShell v2 中绑定错误。感谢 @x0n 的 DefaultParameterSetName 提示! )
如果您尝试使用两组中的参数值运行它,您将收到错误消息。
如果您使用它运行它,-WebUrl Bar
它将提示您输入 DisplayName 的参数值,因为它是必需参数。
还有一个更强大的选项,称为动态参数,它允许根据其他参数的值或任何其他条件动态添加参数。
您必须以不同的方式构建脚本,像往常一样声明常规参数,并包括一个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
节和Begin
节上添加条件以根据任何内容创建不同的参数,例如其他参数值。动态参数可以具有任何名称、类型(字符串、整数、布尔值、对象...)和属性(强制、位置、验证集...),并且它们是在脚本执行之前创建的,以便您获取参数任何支持它的环境中的选项卡完成 (IntelliSense),例如 PowerShell 控制台、PowerShell ISE或 Visual Studio Code 编辑器。
一个典型的例子是根据常规参数的值创建一组不同的动态参数,方法是if
在DynamicParam
部分中使用 simple。
谷歌“PowerShell 动态参数”以获取更多信息,例如显示动态参数的帮助。例如:
您需要使用参数集命名。
您可以将独占参数分配给不同的参数集名称。