Bagaimana saya bisa memeriksa apakah string null atau kosong di PowerShell?


413

Apakah ada fungsi built-in- IsNullOrEmptylike untuk memeriksa apakah string null atau kosong, di PowerShell?

Saya tidak dapat menemukannya sejauh ini dan jika ada cara bawaan, saya tidak ingin menulis fungsi untuk ini.



8
Baik Anda menggunakan .NET, jadi tidak bisakah Anda menelepon String.IsNullOrEmpty?
Jon Skeet

Jawaban:


471

Anda dapat menggunakan IsNullOrEmptymetode statis:

[string]::IsNullOrEmpty(...)

3
Saya lebih suka cara ini karena sudah jelas apa yang dilakukannya terlepas dari pengetahuan Powerhsell Anda - yang akan masuk akal bagi programmer non-Powershell.
pencilCake

18
Saya kira Anda bisa melakukannya! $ Var
Shay Levy

4
Satu hal yang perlu diperhatikan dengan PowerShell adalah bahwa string nol yang diteruskan ke commandlet atau fungsi tidak tetap nol. Mereka dikonversi menjadi string kosong. Lihat bug Microsoft Connect di connect.microsoft.com/PowerShell/feedback/details/861093/… .
JamieSee

25
Pertimbangkan [String] :: IsNullOrWhiteSpace (...) untuk memvalidasi ruang kosong juga.
Sai

3
@ShayLevy Hati-hati dengan !. Itu hanya berfungsi di versi PowerShell yang lebih baru. !adalah alias untuk-not
Kolob Canyon

598

Kalian membuat ini terlalu sulit. PowerShell menangani ini dengan sangat elegan misalnya:

> $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 Ya, apa yang saya katakan dan contoh di atas menunjukkannya dalam tindakan. Apa tes tidak akan memeriksa adalah IsNullOrWhitespace ().
Keith Hill

3
Saya setuju dengan solusi ini lebih baik dari sudut pandang scripting. Seperti biasa, Keith Hill memiliki solusi yang tepat! Terima kasih.
Vippy

2
Anda mengatakan elegan, tetapi untuk beberapa alasan, ini terasa seperti JS.
Dan Atkinson

2
@ VerigoRay Lihat komentar pertama saya di atas di mana saya sarankan menggunakan IsNullOrWhitespace()untuk skenario itu. Tetapi setelah 11 tahun menulis dengan PowerShell, saya merasa saya perlu tes string yang sangat jarang . :-)
Keith Hill

3
"KeithHill. Maaf itu masih tidak aman, karena niat Anda tidak jelas. Ketika Anda menggunakan [string] :: IsNullOrEmpty, Anda benar-benar jelas. IMO, Powershell adalah ciptaan yang paling aneh - sebagian besar waktu itu terlalu kaya, tetapi masih esensi yang hilang. -isNullOrEmpty predikat adalah salah satunya ...
dmitry

40

Selain itu untuk [string]::IsNullOrEmptymemeriksa nol atau kosong, Anda dapat melemparkan string ke Boolean secara eksplisit atau dalam ekspresi 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" }

Keluaran:

False
string is null or empty

False
string is null or empty

True
string is not null or empty

4
Poin yang bagus. Ifklausa secara internal mengubah segala sesuatu di dalam tanda kurung menjadi boolean tunggal yang berarti if($string){Things to do for non-empty-nor-null}atau if(!$string){Things to do for empty-or-null}tanpa konversi eksplisit [bool]akan cukup.
Ch.Idea

20

Jika itu adalah parameter dalam suatu fungsi, Anda dapat memvalidasinya dengan ValidateNotNullOrEmptyseperti yang Anda lihat dalam contoh ini:

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

    #stuff todo
}

10

Secara pribadi, saya tidak menerima spasi putih ($ STR3) sebagai 'tidak kosong'.

Ketika variabel yang hanya berisi spasi putih dilewatkan ke parameter, itu akan sering kesalahan bahwa nilai parameter mungkin bukan '$ nol', alih-alih mengatakan itu mungkin bukan spasi, beberapa perintah hapus mungkin menghapus folder root alih-alih subfolder jika nama subfolder adalah "ruang putih", semua alasan untuk tidak menerima string yang berisi spasi putih dalam banyak kasus.

Saya menemukan ini adalah cara terbaik untuk mencapainya:

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

Kosong

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

Kosong

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

Kosong!! :-)

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

Tidak kosong


5

Saya memiliki skrip PowerShell yang harus saya jalankan di komputer yang ketinggalan zaman sehingga tidak memiliki [String] :: IsNullOrWhiteSpace (), jadi saya menulis skrip saya sendiri.

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

Penggantian PowerShell 2.0 untuk [string]::IsNullOrWhiteSpace()isstring -notmatch "\S"

(" \ S " = karakter non-spasi putih)

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

Performa sangat dekat:

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

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

1

Cara lain untuk mencapai ini dengan cara PowerShell murni adalah dengan melakukan sesuatu seperti ini:

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

Ini berhasil mengevaluasi null, string kosong, dan spasi putih. Saya memformat nilai yang diteruskan menjadi string kosong untuk menangani null (jika tidak, null akan menyebabkan kesalahan ketika Trim dipanggil). Kemudian hanya mengevaluasi kesetaraan dengan string kosong. Saya pikir saya masih lebih suka IsNullOrWhiteSpace, tetapi jika Anda mencari cara lain untuk melakukannya, ini akan berhasil.

$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

Dalam kebosanan, saya bermain dengan beberapa ini dan membuatnya lebih pendek (meskipun lebih samar):

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

atau

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

tergantung pada apa yang Anda coba lakukan.


1

Perhatikan bahwa "if ($str)"dan "IsNullOrEmpty"tes tidak bekerja secara sebanding dalam semua kasus: penugasan $str=0menghasilkan salah untuk keduanya, dan tergantung pada semantik program yang dimaksudkan, ini bisa menghasilkan kejutan.


$ str = 0 bukan praktik pengkodean yang baik. $ str = '0' tidak akan meninggalkan keraguan dalam apa hasil yang diharapkan dari IsNullOrEmpty.
dmitry

-1

Periksa panjangnya. Jika objek itu ada, ia akan memiliki panjang.

Objek kosong tidak memiliki panjang, tidak ada, dan tidak dapat diperiksa.

Objek string memiliki panjang.

Pertanyaannya adalah: IsNull atau IsEmpty, BUKAN IsNull atau IsEmpty atau 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- sudahkah Anda mencoba menjalankan $null.length? :-) Untuk tes bool cepat, menyalurkan ke Get-Member dan kemudian harus menangani kesalahan yang dihasilkan untuk case $ null sepertinya sedikit berat bagi saya.
Keith Hill
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.