Как мне определить, было ли указано значение параметра командлета PowerShell?

StackOverflow https://stackoverflow.com/questions/1203733

Вопрос

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

Это было полезно?

Решение

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

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

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

if (this.IsEnabled.HasValue) { ... }

Другие советы

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

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

  • Ойсин

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

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

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

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

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

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

bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top