ฉันจะตรวจสอบว่าสตริงเป็นโมฆะหรือว่างเปล่าใน PowerShell ได้อย่างไร


413

มีIsNullOrEmptyฟังก์ชันในตัวเพื่อตรวจสอบว่าสตริงเป็นโมฆะหรือว่างเปล่าใน PowerShell หรือไม่

ฉันไม่สามารถค้นหาได้จนถึงตอนนี้และหากมีวิธีในตัวฉันไม่ต้องการเขียนฟังก์ชันสำหรับสิ่งนี้


2
กระโดดนี้ช่วยrkeithhill.wordpress.com/2007/01/06/…
gofor.net

8
คุณใช้. NET อยู่แล้วคุณโทรString.IsNullOrEmptyไม่ได้เหรอ?
Jon Skeet

คำตอบ:


471

คุณสามารถใช้IsNullOrEmptyวิธีการคงที่:

[string]::IsNullOrEmpty(...)

3
ฉันชอบวิธีนี้มากขึ้นเพราะเห็นได้ชัดว่ามันทำอะไรโดยไม่คำนึงถึงความรู้ Powerhsell ของคุณ - ซึ่งจะเหมาะสมสำหรับโปรแกรมเมอร์ที่ไม่ใช่ Powershell
pencilCake

18
ฉันเดาว่าคุณสามารถทำได้! $ var
Shay Levy

4
สิ่งหนึ่งที่ต้องระวังด้วย PowerShell คือสตริงที่ส่งผ่านไปยัง commandlet หรือฟังก์ชั่นไม่เป็นโมฆะ พวกมันถูกแปลงเป็นสตริงว่าง ดูข้อผิดพลาดการเชื่อมต่อ Microsoft ที่connect.microsoft.com/PowerShell/feedback/details/861093/...
JamieSee

25
พิจารณา [String] :: IsNullOrWhiteSpace (... ) เพื่อตรวจสอบความถูกต้องของช่องว่างเช่นกัน
Sai

3
@ShayLevy !ระวังด้วย ใช้งานได้เฉพาะใน PowerShell เวอร์ชันใหม่กว่า !เป็นนามแฝงสำหรับ-not
Kolob Canyon

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 ()
Keith Hill

3
ฉันเห็นด้วยกับวิธีนี้ดีกว่าจากมุมมองสคริปต์ เช่นเคย Keith Hill มีทางออกที่ถูกต้อง! ขอบคุณ
Vippy

2
คุณพูดได้ดี แต่ด้วยเหตุผลบางอย่างนี่ให้ความรู้สึกเหมือน JS
Dan Atkinson

2
@VertigoRay ดูความคิดเห็นแรกของฉันด้านบนซึ่งฉันแนะนำให้ใช้IsNullOrWhitespace()สำหรับสถานการณ์นั้น แต่หลังจาก 11 ปีของการเขียนสคริปต์กับ PowerShell ผมพบฉันต้องว่าการทดสอบสตริงมากไม่ค่อย :-)
Keith Hill

3
"KeithHill ขออภัยที่ยังไม่ปลอดภัยเนื่องจากความตั้งใจของคุณยังไม่ชัดเจนเมื่อคุณใช้ [string] :: IsNullOrEmpty คุณชัดเจนจริงๆ IMO, Powershell คือการสร้างที่แปลกประหลาดที่สุด แต่ก็ยังอุดมสมบูรณ์มาก ขาดข้อมูลสำคัญ - isNullOrEmpty predicate เป็นหนึ่งในนั้น ...
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]จะเพียงพอ
Ch.Idea

20

หากเป็นพารามิเตอร์ในฟังก์ชั่นคุณสามารถตรวจสอบได้ด้วยValidateNotNullOrEmptyตามที่คุณเห็นในตัวอย่างนี้:

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

    #stuff todo
}

10

ส่วนตัวฉันไม่ยอมรับช่องว่าง ($ 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'}

ไม่ว่างเปล่า


5

ฉันมีสคริปต์ PowerShell ฉันต้องเรียกใช้บนคอมพิวเตอร์จนล้าสมัยจนไม่มี [String] :: IsNullOrWhiteSpace () ดังนั้นฉันจึงเขียนด้วยตัวเอง

function IsNullOrWhitespace($str)
{
    if ($str)
    {
        return ($str -replace " ","" -replace "`t","").Length -eq 0
    }
    else
    {
        return $TRUE
    }
}


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())

สิ่งนี้ประเมินผลสำเร็จสำหรับ 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())

ขึ้นอยู่กับสิ่งที่คุณพยายามจะทำ


1

โปรดทราบว่าการทดสอบ"if ($str)"และ"IsNullOrEmpty"ไม่สามารถใช้งานได้ในทุกกรณี: การกำหนด$str=0ผลิตผลเป็นเท็จสำหรับทั้งสองและขึ้นอยู่กับความหมายของโปรแกรมที่ตั้งใจไว้ซึ่งอาจทำให้เกิดความประหลาดใจ


$ str = 0 ไม่ใช่วิธีการเข้ารหัสที่ดี $ str = '0' จะไม่สงสัยในผลลัพธ์ที่คาดหวังของ IsNullOrEmpty
dmitry

-1

ตรวจสอบความยาว ถ้าวัตถุมีอยู่มันจะมีความยาว

วัตถุ 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 

2
RE Null objects have no length- คุณลองดำเนินการแล้ว$null.lengthหรือยัง? :-) สำหรับการทดสอบบูลอย่างรวดเร็วให้ส่งไปที่ Get-Member แล้วต้องจัดการกับข้อผิดพลาดที่เกิดขึ้นกับ $ null ซึ่งดูเหมือนจะหนักนิดหน่อยสำหรับฉัน
Keith Hill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.