Как проверить, является ли строка пустой или пустой в PowerShell?

Есть ли встроенная функция IsNullOrEmpty -like, чтобы проверить, является ли строка пустой или пустой, в PowerShell?

Я не мог найти его до сих пор, и если есть встроенный способ, я не хочу писать функцию для этого.

Ответ 1

Вы можете использовать статический метод IsNullOrEmpty:

[string]::IsNullOrEmpty(...)

Ответ 2

Вы, ребята, делаете это слишком сложно. PowerShell обрабатывает это довольно элегантно, например:

> $str1 = $null
> if ($str1) { 'not empty' } else { 'empty' }
empty

> $str2 = ''
> if ($str2) { 'not empty' } else { 'empty' }
empty

> $str3 = ' '
> if ($str3) { 'not empty' } else { 'empty' }
not empty

> $str4 = 'asdf'
> if ($str4) { 'not empty' } else { 'empty' }
not empty

> if ($str1 -and $str2) { 'neither empty' } else { 'one or both empty' }
one or both empty

> if ($str3 -and $str4) { 'neither empty' } else { 'one or both empty' }
neither empty

Ответ 3

В дополнение к [string]::IsNullOrEmpty для проверки нулевого или пустого вы можете явно вывести строку в Boolean или в булевы выражения:

$string = $null
[bool]$string
if (!$string) { "string is null or empty" }

$string = ''
[bool]$string
if (!$string) { "string is null or empty" }

$string = 'something'
[bool]$string
if ($string) { "string is not null or empty" }

Вывод:

False
string is null or empty

False
string is null or empty

True
string is not null or empty

Ответ 4

Если это параметр в функции, вы можете проверить его с помощью ValidateNotNullOrEmpty, как вы можете видеть в этом примере:

Function Test-Something
{
    Param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$UserName
    )

    #stuff todo
}

Ответ 5

Лично я не принимаю пробел ($ STR3) как "не пустой".

Когда переменная, содержащая только пробелы, передается в параметр, часто будет ошибочно, что значение параметров может не быть "$ null", вместо того, чтобы говорить, что это может быть не пустое место, некоторые команды удаления могут удалить корневую папку вместо подпапки, если имя подпапки является "белым пространством", все причины не допускают строку, содержащую пробелы во многих случаях.

Я считаю, что это лучший способ выполнить это:

$STR1 = $null
IF ([string]::IsNullOrWhitespace($STR1)){'empty'} else {'not empty'}

Empty

$STR2 = ""
IF ([string]::IsNullOrWhitespace($STR2)){'empty'} else {'not empty'}

Empty

$STR3 = " "
IF ([string]::IsNullOrWhitespace($STR3)){'empty !! :-)'} else {'not Empty :-('}

Empty!!: -)

$STR4 = "Nico"
IF ([string]::IsNullOrWhitespace($STR4)){'empty'} else {'not empty'}

Не пуст

Ответ 6

У меня есть PowerShell script Мне нужно запустить на компьютере настолько устаревшим, что у него нет [String]:: IsNullOrWhiteSpace(), поэтому я написал свой собственный.

function IsNullOrWhitespace($str)
{
    if ($str)
    {
        return ($str -replace " ","" -replace "`t","").Length -eq 0
    }
    else
    {
        return $TRUE
    }
}

Ответ 7

# cases
$x = null
$x = ''
$x = ' '

# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}

Ответ 8

Обратите внимание, что тесты "if ($str)" и "IsNullOrEmpty" не работают сопоставимо во всех случаях: присваивание $str=0 приводит к ложному результату для обоих, и в зависимости от предполагаемой семантики программы это может привести к неожиданности.

Ответ 9

Другой способ сделать это чисто PowerShell - сделать что-то вроде этого:

("" -eq ("{0}" -f $val).Trim())

Это успешно оценивается для нулевой, пустой строки и пробела. Я форматирую переданное значение в пустую строку для обработки нулевого значения (иначе нулевое значение вызовет ошибку при вызове Trim). Тогда просто оцените равенство с пустой строкой. Я думаю, что я все еще предпочитаю IsNullOrWhiteSpace, но если вы ищете другой способ сделать это, это будет работать.

$val = null    
("" -eq ("{0}" -f $val).Trim())
>True
$val = "      "
("" -eq ("{0}" -f $val).Trim())
>True
$val = ""
("" -eq ("{0}" -f $val).Trim())
>True
$val = "not null or empty or whitespace"
("" -eq ("{0}" -f $val).Trim())
>False

В порыве скуки я немного поиграл с этим и сделал его короче (хотя и более загадочным):

!!(("$val").Trim())

или же

!(("$val").Trim())

в зависимости от того, что вы пытаетесь сделать.

Ответ 10

Замена PowerShell 2.0 для [string]::IsNullOrWhiteSpace() является string -notmatch "\S"

(" \ S " = любой непробельный символ)

> $null  -notmatch "\S"
True
> "   "  -notmatch "\S"
True
> " x "  -notmatch "\S"
False

Производительность очень близка:

> Measure-Command {1..1000000 |% {[string]::IsNullOrWhiteSpace("   ")}}
TotalMilliseconds : 3641.2089

> Measure-Command {1..1000000 |% {"   " -notmatch "\S"}}
TotalMilliseconds : 4040.8453

Ответ 11

Проверьте длину. Если объект существует, он будет иметь длину.

Нулевые объекты не имеют длины, не существуют и не могут быть проверены.

Объект String имеет длину.

Вопрос был: IsNull или IsEmpty, NOT IsNull или IsEmpty или IsWhiteSpace

#Null
$str1 = $null
$str1.length
($str1 | get-member).TypeName[0]
# Returns big red error

#Empty
$str2 = ""
$str2.length
($str2 | get-member).TypeName[0]
# Returns 0

## Whitespace
$str3 = " "
$str3.length
($str3 | get-member).TypeName[0]
## Returns 1