Как мне определить, было ли указано значение параметра командлета PowerShell?
-
05-07-2019 - |
Вопрос
В 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");