มี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]
จะเพียงพอ
หากเป็นพารามิเตอร์ในฟังก์ชั่นคุณสามารถตรวจสอบได้ด้วยValidateNotNullOrEmpty
ตามที่คุณเห็นในตัวอย่างนี้:
Function Test-Something
{
Param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$UserName
)
#stuff todo
}
ส่วนตัวฉันไม่ยอมรับช่องว่าง ($ STR3) ว่าเป็น 'ไม่ว่างเปล่า'
เมื่อตัวแปรที่มีเพียงช่องว่างถูกส่งผ่านไปยังพารามิเตอร์มันมักจะผิดพลาดว่าค่าพารามิเตอร์อาจไม่เป็น '$ null' แทนที่จะบอกว่าอาจไม่ใช่ช่องว่างคำสั่งลบบางคำสั่งอาจลบโฟลเดอร์รูทแทนที่จะเป็น โฟลเดอร์ย่อยหากชื่อโฟลเดอร์ย่อยเป็น "white space" เหตุผลทั้งหมดที่จะไม่ยอมรับสตริงที่มีช่องว่างในหลาย ๆ กรณี
ฉันพบว่านี่เป็นวิธีที่ดีที่สุดในการบรรลุเป้าหมาย:
$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())
สิ่งนี้ประเมินผลสำเร็จสำหรับ null, สตริงว่างและช่องว่าง ฉันกำลังจัดรูปแบบค่าที่ส่งผ่านเป็นสตริงว่างเปล่าเพื่อจัดการค่าว่าง (มิฉะนั้นค่า null จะทำให้เกิดข้อผิดพลาดเมื่อเรียกว่าการตัดแต่ง) จากนั้นเพียงแค่ประเมินความเท่าเทียมกันกับสตริงที่ว่างเปล่า ฉันคิดว่าฉันยังคงชอบ 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
ผลิตผลเป็นเท็จสำหรับทั้งสองและขึ้นอยู่กับความหมายของโปรแกรมที่ตั้งใจไว้ซึ่งอาจทำให้เกิดความประหลาดใจ
ตรวจสอบความยาว ถ้าวัตถุมีอยู่มันจะมีความยาว
วัตถุ Null ไม่มีความยาวไม่มีอยู่และไม่สามารถตรวจสอบได้
วัตถุสตริงมีความยาว
คำถามคือ: 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
Null objects have no length
- คุณลองดำเนินการแล้ว$null.length
หรือยัง? :-) สำหรับการทดสอบบูลอย่างรวดเร็วให้ส่งไปที่ Get-Member แล้วต้องจัดการกับข้อผิดพลาดที่เกิดขึ้นกับ $ null ซึ่งดูเหมือนจะหนักนิดหน่อยสำหรับฉัน