Як я можу перевірити, чи рядок є нульовою чи порожньою в PowerShell?


413

Чи є вбудована- IsNullOrEmptyподібна функція для того, щоб перевірити, чи рядок є нульовим чи порожнім в PowerShell?

Я не міг цього знайти, і якщо є вбудований спосіб, я не хочу писати для цього функцію.


2
hop це допомагає rkeithhill.wordpress.com/2007/01/06/…
gofor.net

8
Ви використовуєте .NET, тому не можете зателефонувати String.IsNullOrEmpty?
Джон Скіт

Відповіді:


471

Ви можете використовувати IsNullOrEmptyстатичний метод:

[string]::IsNullOrEmpty(...)

3
Мені подобається цей спосіб більше, тому що очевидно, що він робить, незалежно від ваших знань Powerhsell - що мало б сенс для програмістів, які не користуються державою.
pencilCake

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
Я згоден з цим рішенням краще з точки зору сценаріїв. Як завжди, у Кіта Хіла є правильне рішення! Дякую.
Виппі

2
Ви говорите елегантно, але чомусь це відчувається як JS.
Ден Аткінсон

2
@VertigoRay Дивіться мій перший коментар вище, де я рекомендую використовувати IsNullOrWhitespace()для цього сценарію. Але після 11 років сценаріїв з PowerShell я вважаю, що мені потрібен цей строковий тест дуже рідко . :-)
Кіт Хілл

3
"KeithHill. Вибачте, що все ще небезпечно, оскільки ваш намір не зрозумілий. Коли ви використовуєте [string] :: IsNullOrEmpty, ви абсолютно зрозумілі. IMO, Powershell - найдивніше творіння - у більшості випадків воно надзвичайно багате, але все ж відсутні основні речі. -isNullOrEmpty предикат є одним з них ...
dmitry

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
    }
}

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'}

3

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

1

Ще одним способом досягти цього чистого способу PowerShell було б зробити щось подібне:

("" -eq ("{0}" -f $val).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, 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 

2
RE Null objects have no length- ви намагалися виконати $null.length? :-) Для швидкого тесту на завантаження, трубопровід в Get-Member, а потім доведеться обробляти отриману помилку для випадку $ null, здається мені трохи важким.
Кіт Хілл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.