Как определить, было ли указано значение параметра PowerShell Cmdlet? - PullRequest
5 голосов
/ 30 июля 2009

В PowerShell 1.0, если у меня есть параметр командлета типа enum, какой метод рекомендуется проверить, указывал ли пользователь этот параметр в командной строке командлета? Например:

MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 }

class DoSomethingCommand : PSCmdlet
...
private MyEnum isEnabled;

[Parameter(Mandatory = false)]
public MyEnum IsEnabled
{
    get { return isEnabled; }
    set { isEnabled = value; }
}

protected override void ProcessRecord()
{
    // How do I know if the user passed -IsEnabled <value> to the cmdlet?
}

Есть ли способ сделать это без необходимости заполнять isEnabled фиктивным значением? По умолчанию он будет равен 0, и я не хочу начинать каждый параметр или добавлять фиктивное значение в мое перечисление. У меня потенциально есть много командлетов со 100 параметрами, должен быть лучший способ. Это связано с этим вопросом , но я искал более чистый способ сделать это. Благодарю.

Ответы [ 6 ]

9 голосов
/ 31 июля 2009

В этом случае я бы использовал обнуляемую оболочку вокруг типа enum, например

[Parameter(Mandatory = false)]
public MyEnum? IsEnabled { get; set; }

Обратите внимание на?модификатор на MyEnum.Затем вы можете проверить, установлен ли он так:

if (this.IsEnabled.HasValue) { ... }
4 голосов
/ 30 июля 2009

За исключением PowerShell, никогда не бывает хорошим способом использовать 0 таким образом. Вы должны всегда использовать 0 для наиболее подходящего значения по умолчанию. В этом случае наиболее подходящим значением по умолчанию должно быть что-то вроде «Unset».

В конечном счете, это не имеет ничего общего с PowerShell и не имеет ничего общего с хорошими методами кодирования для .NET.

  • Oisin
2 голосов
/ 27 декабря 2018

В качестве опции вы можете использовать $PSBoundParameters collection, чтобы проверить, передан ли метод.

Предположим, у нас есть файл json, подобный следующему { "p1": "value1", "p2": "value2" }, и мы хотим создать функцию, которая принимает параметры p1 и p2 и обновляет значения p1 и p2 в файле, если перешел в функцию. Допустим, эти значения могут быть null, и наличие этих значений в качестве нуля не эквивалентно тому, что они не были переданы.

Например, Update-Values -p1 $null должен обновить p1 до null и не должен меняться p2.

Для этого мы должны быть в состоянии определить, передан ли параметр методу или нет.

Пример - Как определить, передан ли параметр, для необязательного параметра, который может принимать значение NULL в качестве значения?

Function Update-Values ($p1, $p2) {
    If($PSBoundParameters.ContainsKey("p1")) {
        Write-Host "p1 passed"
    }
    else {
        Write-Host "p1 not passed"
    }
    If($PSBoundParameters.ContainsKey("p2")) {
        Write-Host "p2 passed"
    }
    else {
        Write-Host "p2 not passed"
    }
}

Тогда, если вы запустите функцию, используя следующий параметр:

Update-Values -p1 $null
# Update-Values -p1 "something"

В результате вы увидите:

p1 passed
p2 not passed

Вы можете прочитать сообщение в блоге здесь: Как определить, передается ли параметр командлету Powershell .

1 голос
/ 30 сентября 2009

Я знаю, что этот поток немного устарел, но лучший способ сделать это - объявить ваш параметр, используя тип SwitchParameter. Тогда вашим пользователям не нужно передавать -IsEnabled, они просто добавят что-то вроде -Enabled в качестве параметра.

Затем вы проверяете свойство .IsPresent вашего параметра, чтобы увидеть, добавил ли вызывающий объект -Enabled к вызову командлета.

1 голос
/ 30 июля 2009

Единственное, что я могу видеть, это изменить ваше перечисление так, чтобы значение 0 называлось Неизвестно или что-то в этом роде.

Проблема в том, что перечисления являются просто целыми числами в фоновом режиме, а целые числа являются типами значений. Печальным последствием является то, что они должны иметь значение, и по умолчанию это значение равно 0.

0 голосов
/ 15 августа 2014
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...