Значение параметра по умолчанию для строки PowerShell не работает должным образом
#Requires -Version 2.0
[CmdletBinding()]
Param(
[Parameter()] [string] $MyParam = $null
)
if($MyParam -eq $null) {
Write-Host 'works'
} else {
Write-Host 'does not work'
}
Выходы "не работают" = > похоже, что строки преобразуются из пустого в пустую строку неявно? Зачем? И как проверить, если строка пуста или действительно $null? Это должно быть два разных значения!
Ответы
Ответ 1
Хорошо, нашел ответ @https://www.codykonior.com/2013/10/17/checking-for-null-in-powershell/
Предполагая, что:
Param(
[string] $stringParam = $null
)
И параметр не был указан (используется значение по умолчанию):
# will NOT work
if ($null -eq $stringParam)
{
}
# WILL work:
if ($stringParam -eq "" -and $stringParam -eq [String]::Empty)
{
}
В качестве альтернативы вы можете указать специальный нулевой тип:
Param(
[string] $stringParam = [System.Management.Automation.Language.NullString]::Value
)
В этом случае $null -eq $stringParam
будет работать как ожидалось.
Weird!
Ответ 2
Вам нужно будет использовать атрибут AllowNull
, если вы хотите разрешить $null
для строковых параметров:
[CmdletBinding()]
Param (
[Parameter()]
[AllowNull()]
[string] $MyParam
)
И обратите внимание, что вы должны использовать $null в левой части сравнения:
if ($null -eq $MyParam)
если вы хотите, чтобы он работал предсказуемо
Ответ 3
Таким образом, по умолчанию значение $null
для параметров типа [string]
по умолчанию равно пустой строке.
Вариант 1
if ($stringParam) { ... }
Вариант 2
if ($stringParam -eq "") { ... }
Вариант 3
if ($stringParam -eq [String]::Empty) { ... }
Ответ 4
видя много сравнений сравнений с [String]:: Empty, вы можете использовать статические методы [String]:: IsNullOrWhiteSpace или [String]:: IsNullOrEmpty, например:
param(
[string]$parameter = $null
)
# we know this is false
($null -eq $parameter)
[String]::IsNullOrWhiteSpace($parameter)
[String]::IsNullOrEmpty($parameter)
('' -eq $parameter)
("" -eq $parameter)
который дает:
PS C:\...> .\foo.ps1
False
True
True
True
True
Ответ 5
Просто не объявляйте тип параметра, если вы хотите оставить нулевое значение:
Param(
$stringParam
)
(Ни один из других решений не работал у меня при объявлении типа.)