Чи є вбудована- IsNullOrEmpty
подібна функція для того, щоб перевірити, чи рядок є нульовим чи порожнім в PowerShell?
Я не міг цього знайти, і якщо є вбудований спосіб, я не хочу писати для цього функцію.
String.IsNullOrEmpty
?
Чи є вбудована- IsNullOrEmpty
подібна функція для того, щоб перевірити, чи рядок є нульовим чи порожнім в PowerShell?
Я не міг цього знайти, і якщо є вбудований спосіб, я не хочу писати для цього функцію.
String.IsNullOrEmpty
?
Відповіді:
Ви можете використовувати IsNullOrEmpty
статичний метод:
[string]::IsNullOrEmpty(...)
!
. Це працює лише в новіших версіях PowerShell. !
- псевдонім для-not
Ви, хлопці, робите це занадто важко. 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
IsNullOrWhitespace()
для цього сценарію. Але після 11 років сценаріїв з PowerShell я вважаю, що мені потрібен цей строковий тест дуже рідко . :-)
На додаток до [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
If
пункт внутрішньо перетворює все, що знаходиться в круглих дужках, в єдиний булевий, що означає if($string){Things to do for non-empty-nor-null}
або if(!$string){Things to do for empty-or-null}
без явного перетворення [bool]
буде достатньо.
Особисто я не приймаю пробіл ($ 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'}
Не порожній
У мене є сценарій PowerShell, який мені потрібно запустити на комп’ютері настільки застарілим, що у нього немає [String] :: IsNullOrWhiteSpace (), тому я написав власний.
function IsNullOrWhitespace($str)
{
if ($str)
{
return ($str -replace " ","" -replace "`t","").Length -eq 0
}
else
{
return $TRUE
}
}
# cases
$x = null
$x = ''
$x = ' '
# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}
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
Ще одним способом досягти цього чистого способу 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())
залежно від того, що ви намагаєтеся зробити.
Зауважте, що "if ($str)"
і "IsNullOrEmpty"
тести працюють не в порівнянні у всіх випадках: призначення $str=0
присвоює помилки для обох, і залежно від призначеної семантики програми, це може викликати несподіванку.
Перевірте довжину. Якщо об’єкт існує, він буде мати довжину.
Нульові об'єкти не мають довжини, не існують і їх неможливо перевірити.
Об'єкт струни має довжину.
Питання було: 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
Null objects have no length
- ви намагалися виконати $null.length
? :-) Для швидкого тесту на завантаження, трубопровід в Get-Member, а потім доведеться обробляти отриману помилку для випадку $ null, здається мені трохи важким.