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

413

Существует ли встроенная IsNullOrEmptyфункция, подобная функции для проверки, является ли строка пустой или пустой в PowerShell?

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

pencilCake
источник
2
хоп это поможет rkeithhill.wordpress.com/2007/01/06/…
gofor.net
8
Ну, вы используете .NET, так что вы не можете позвонить String.IsNullOrEmpty?
Джон Скит

Ответы:

471

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

[string]::IsNullOrEmpty(...)
Шей Леви
источник
3
Мне больше нравится этот способ, поскольку очевидно, что он делает, независимо от ваших знаний Powerhsell, что имело бы смысл для программистов не из Powershell.
Карандашный торт
18
Я думаю, вы можете просто сделать! $ Var
Шей Леви
4
С PowerShell следует помнить, что пустые строки, передаваемые в командлет или функцию, не остаются пустыми. Они преобразуются в пустые строки. См. Ошибку Microsoft Connect по адресу connect.microsoft.com/PowerShell/feedback/details/861093/… .
JamieSee
25
Рассмотрим [String] :: IsNullOrWhiteSpace (...) для проверки пустых пространств.
Сай
3
@ShayLevy Осторожнее с !. Это работает только в новых версиях PowerShell. !это псевдоним для-not
Колоб Каньон
598

Вы, ребята, делаете это слишком сложно. 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
Кит Хилл
источник
30
@pencilCake Да, это то, что я говорю, и пример выше показывает это в действии. Тест не будет проверять IsNullOrWhitespace ().
Кит Хилл
3
Я согласен с этим решением лучше с точки зрения сценариев. Как всегда, Кит Хилл имеет правильное решение! Спасибо.
Vippy
2
Вы говорите элегантно, но по какой-то причине это похоже на JS.
Дэн Аткинсон
2
@VertigoRay Смотрите мой первый комментарий выше, где я рекомендую использовать IsNullOrWhitespace()для этого сценария. Но после 11 лет написания сценариев в PowerShell я обнаружил, что мне очень редко нужен этот строковый тест . :-)
Кит Хилл
3
«KeithHill. Извините, это все еще небезопасно, поскольку ваше намерение неясно. Когда вы используете [string] :: IsNullOrEmpty, вы абсолютно чисты. ИМО, Powershell - странное создание - в большинстве случаев оно слишком богато, но все же пропущенные предметы первой необходимости. -isNullOrEmpty предикат является одним из них ...
Дмитрий
40

В дополнение к тому [string]::IsNullOrEmpty, чтобы проверить наличие пустых или пустых значений, вы можете привести строку к логическому явному выражению или в булевых выражениях:

$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
Хороший вопрос. IfПредложение внутренне преобразует все, что находится внутри круглых скобок, в единственное логическое значение, что означает, что if($string){Things to do for non-empty-nor-null}или if(!$string){Things to do for empty-or-null}без явного преобразования [bool]будет достаточно.
Ч.Идея
20

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

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

    #stuff todo
}
Рубанов
источник
10

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

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

Я считаю, что это лучший способ сделать это:

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

пустой

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

пустой

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

Слейте !! :-)

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

Не пусто

Нико ван дер Сток
источник
5

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

function IsNullOrWhitespace($str)
{
    if ($str)
    {
        return ($str -replace " ","" -replace "`t","").Length -eq 0
    }
    else
    {
        return $TRUE
    }
}
mhenry1384
источник
5
# cases
$x = null
$x = ''
$x = ' '

# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}
Skatterbrainz
источник
3

Замена PowerShell 2.0 для [string]::IsNullOrWhiteSpace()isstring -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
Николай Полягошко
источник
1

Другой способ сделать это чисто 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())

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

Райан
источник
1

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

Стив Фридл
источник
$ str = 0 не очень хорошая практика кодирования. $ str = '0' не оставит сомнений в ожидаемом результате IsNullOrEmpty.
дмитрий
-1

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

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

Строковый объект имеет длину.

Вопрос был: IsNull или IsEmpty, НЕ 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 
Люк Б.
источник
2
RE Null objects have no length- вы пытались выполнить$null.length ? :-) Для быстрого bool-теста, пайпинг в Get-Member и последующая обработка возникающей ошибки для случая $ null кажутся мне немного тяжелыми.
Кит Хилл