Возможно, стоит добавить, что для объектов-оболочек для примитивных типов - то есть Int, Long, Double - == вернет true, если два значения равны.
Long a = 10L;
Long b = 10L;
if (a == b) {
System.out.println("Wrapped primitives behave like values");
}
Чтобы контрастировать, выше двух Longs на два отдельных ArrayLists, equals считает их одинаковыми, но == не делает.
ArrayList<Long> c = new ArrayList<>();
ArrayList<Long> d = new ArrayList<>();
c.add(a);
d.add(b);
if (c == d) System.out.println("No way!");
if (c.equals(d)) System.out.println("Yes, this is true.");
Как сказал христианин, это может быть выполнено через 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 будет связана с ошибкой, если вы не добавите [CmdletBinding(DefaultParameterSetName="set1")]
в [@ g0])
Если вы попытаетесь запустить его со значением параметра из обоих наборов, вы получите сообщение об ошибке.
Если вы запустите его с помощью -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
и Beign
для создания разных параметров в зависимости от чего угодно, например, других значения параметров. Динамические параметры могут иметь любое имя, тип (строка, int, bool, object ...) атрибуты (обязательные, позиции, проверять набор ...), и они создаются до выполнения сценария, так что вы получаете параметр (intellisense) в любой среде, которая поддерживает его, например, в консоли PS, PS ISE или редакторе кода Visual Studio.
Типичным примером может быть создание другого набора динамических параметров в зависимости от значение регулярного параметра, используя простой if
в разделе DynamicParam
.
Google «параметры динамической настройки» для дополнительной информации, например, показ справки по динамическим параметрам. Например:
$PSCmdlet.ParameterSetName
существует, поэтому вы можете принять соответствующее действие на основе набора параметров, оцененного процессом привязки параметров. Кстати, интересно, что вы получили ошибку, похоже, это разница в поведении между PSv2 и PSv3. – Andy Arismendi 25 May 2012 в 07:19