Apakah ada fungsi built-in- IsNullOrEmpty
like 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.
String.IsNullOrEmpty
?
Apakah ada fungsi built-in- IsNullOrEmpty
like 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.
String.IsNullOrEmpty
?
Jawaban:
Anda dapat menggunakan IsNullOrEmpty
metode statis:
[string]::IsNullOrEmpty(...)
!
. Itu hanya berfungsi di versi PowerShell yang lebih baru. !
adalah alias untuk-not
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
IsNullOrWhitespace()
untuk skenario itu. Tetapi setelah 11 tahun menulis dengan PowerShell, saya merasa saya perlu tes string yang sangat jarang . :-)
Selain itu untuk [string]::IsNullOrEmpty
memeriksa 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
If
klausa 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.
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
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
}
}
# cases
$x = null
$x = ''
$x = ' '
# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}
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
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.
Perhatikan bahwa "if ($str)"
dan "IsNullOrEmpty"
tes tidak bekerja secara sebanding dalam semua kasus: penugasan $str=0
menghasilkan salah untuk keduanya, dan tergantung pada semantik program yang dimaksudkan, ini bisa menghasilkan kejutan.
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
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.