Ответ 1
Как упоминалось в ответе Рона Эдвардса, [AllowNull()]
и/или [AllowEmptyString()]
являются частью решения, но нужно учитывать несколько вещей.
Несмотря на то, что пример, заданный в вопросе, имеет строку типа, вопрос о заголовке заключается в том, как передать значение null в обязательный параметр без упоминания типа, поэтому нам нужно немного расширить ответ.
Сначала давайте посмотрим, как PowerShell обрабатывает присвоение $null определенным типам:
PS C:\> [int] $null
0
PS C:\> [bool] $null
False
PS C:\> [wmi] $null
PS C:\>
PS C:\> [string] $null
PS C:\>
Анализ результатов:
- Передача
$null
в[int]
возвращает объект[int]
со значением0
- Передача
$null
в[bool]
возвращает объект[bool]
со значениемFalse
- Передача
$null
в[wmi]
возвращает... ничего. Он вообще не создает объект. Это можно подтвердить, выполнив([wmi] $null).GetType()
, который выдает ошибку - Передача
$null
в[string]
возвращает объект[string]
со значением''
(пустая строка). Это можно подтвердить, выполнив([string] $null).GetType()
и([string] $null).Length
Итак, если у нас есть функция с необязательным параметром [int]
, какое значение оно будет иметь, если мы не пройдем этот параметр? Пусть проверьте:
Function Foo {
Param (
[int] $Bar
)
Write-Host $Bar
}
Foo
> 0
Очевидно, если бы это было [bool]
значение с be False
, и если бы это было [string]
, это значение было бы ''
Поэтому, когда у нас есть обязательный параметр стандартных большинства стандартных типов, и мы назначаем его $null
, мы не получаем $null
, а скорее "значение по умолчанию" для этого типа.
Пример:
Function Foo {
Param (
[Parameter(Mandatory = $true)][int] $Bar
)
Write-Host $Bar
}
Foo -Bar $null
> 0
Обратите внимание, что там нет [AllowNull()]
, но он все равно возвращает 0
.
A [string]
несколько отличается, в том смысле, что он не разрешает пустые строки по обязательным параметрам, поэтому пример в вопросе не работает. [AllowNull()]
также не исправляет его, поскольку пустая строка не совпадает с $null
, поэтому нам нужно использовать [AllowEmptyString()]
. Ничего другого не удастся.
Итак, где [AllowNull()]
входит в игру и как передать "реальный" $null
в int, bool, wmi и т.д.?
Ни int, ни bool не являются типами NULL, поэтому для того, чтобы передать им "реальный" $null
, вы должны сделать их обнуляемыми:
Function Foo {
Param (
[Parameter(Mandatory = $true)][AllowNull()][System.Nullable[int]] $Bar
)
Write-Host $Bar
}
Это позволяет передать "true" $null
в int, очевидно, при вызове Write-Host
он преобразует $null
в строку, и мы снова получаем с помощью ''
, поэтому он все равно будет выводиться что-то, но это передача "true" $null
.
Необязательные типы, такие как [wmi]
(или .NET-класс), проще, поскольку они уже можно с нулевым значением с самого начала, поэтому их не нужно делать нулевыми, но при этом требуется [AllowNull()]
.
Как для того, чтобы сделать [string]
поистине нулевым, это еще ускользает от меня, как пытаюсь сделать:
[System.Nullable[string]]
Возвращает ошибку. Скорее всего, потому что a system.string
уже обнуляется, хотя PowerShell, похоже, не видит этого.
ИЗМЕНИТЬ
Я только заметил, что пока
[bool] $null
принуждается к False
, делая...
Function Foo {
Param (
[bool] $Bar
)
$Bar
}
Foo -Bar $null
выдает следующую ошибку:
Foo : Cannot process argument transformation on parameter 'Bar'. Cannot convert value "" to type "System.Boolean".
Это довольно странно, тем более что использование [switch]
в функции выше вместо [bool]
работает.