Подтвердить что ты не робот

Значение параметра по умолчанию для строки 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? Это должно быть два разных значения!

4b9b3361

Ответ 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
)

(Ни один из других решений не работал у меня при объявлении типа.)