Используйте if-else, принимая входные данные в параметре Powershell [duplicate]

Возможно, стоит добавить, что для объектов-оболочек для примитивных типов - то есть 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.");
7
задан jumbo 25 May 2012 в 06:35
поделиться

3 ответа

Как сказал христианин, это может быть выполнено через 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, потому что это обязательный параметр.

10
ответ дан Andy Arismendi 18 August 2018 в 11:56
поделиться
  • 1
    Это именно то, что мне нужно! Спасибо! Только одно: когда я запускаю это без параметров, я получаю сообщение об ошибке (но я так хотел). Один последующий вопрос: при использовании наборов параметров предполагается использовать переключатель с переменной $ PSCmdlet.ParameterSetName, правильно? – jumbo 25 May 2012 в 07:14
  • 2
    Правильно, $PSCmdlet.ParameterSetName существует, поэтому вы можете принять соответствующее действие на основе набора параметров, оцененного процессом привязки параметров. Кстати, интересно, что вы получили ошибку, похоже, это разница в поведении между PSv2 и PSv3. – Andy Arismendi 25 May 2012 в 07:19
  • 3
    Уловкой заставить его работать как v3 является использование директивы set по умолчанию. Я отредактировал ваш ответ, чтобы показать это. – x0n 25 May 2012 в 15:49
  • 4
    @ x0n Ах спасибо за редактирование! – Andy Arismendi 25 May 2012 в 15:56
  • 5
    Если вы создаете свой Cmdlet как сборку .NET, то DefaultParameterSetName должен идти в атрибуте [Cmdlet ()] - он не будет работать, если вы добавите отдельный атрибут [CmdletBinding ()] – Gareth Oakley 15 January 2013 в 16:55

Вам нужно использовать Параметры Установить именование . Вы можете назначить исключающий параметр другому имени набора параметров.

1
ответ дан CB. 18 August 2018 в 11:56
поделиться
  • 1
    Можете ли вы дать мне небольшой пример того, как я могу выполнить то, что я написал? – jumbo 25 May 2012 в 06:55
  • 2
    Читайте здесь blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/… Я слишком занят, чтобы написать пример, но ссылка дает действительно хорошее объяснение. – CB. 25 May 2012 в 07:02
  • 3
    Код в комментариях выглядит плохо ... но: param ([Parameter (ParameterSetName = 'rel', Mandatory = $ true)] [string] $ RelativeUrl, [Parameter (ParameterSetName = 'web', Mandatory = $ true)] [string ] $ WebUrl, [Параметр (ParameterSetName = 'web', Mandatory = $ true)] [string] $ DisplayName) Теперь вам нужно указать параметр sets , по одному для каждого сценария. Параметр может перейти к нескольким наборам или ко всем наборам (если не указано имя параметраSetName). Больше в help about_Functions_Advanced_Parameters – BartekB 25 May 2012 в 07:06

Существует гораздо более мощный вариант, называемый динамическими параметрами, который позволяет динамически добавлять параметры в зависимости от значения других параметров или любого другого условия.

Вы должны структурировать свой скрипт по-другому, объявляя обычные параметры как обычно и включающий блок 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 «параметры динамической настройки» для дополнительной информации, например, показ справки по динамическим параметрам. Например:

2
ответ дан JotaBe 18 August 2018 в 11:56
поделиться
  • 1
    Спасибо за этот ответ. Несмотря на то, что первоначальный ответ был действительно тем, что мне нужно, это определенно очень интересный способ решения проблемы, и я могу видеть его силу в некоторых сложных случаях. Кроме того, я бы сказал, что этот вариант сильно игнорируется и, следовательно, не очень хорошо известен. Еще раз спасибо за обмен. – jumbo 18 May 2018 в 08:12
Другие вопросы по тегам:

Похожие вопросы: