यदि कोई स्ट्रिंग PowerShell में रिक्त या रिक्त है, तो मैं कैसे जांच सकता हूं?


413

IsNullOrEmptyपावरस् लेल में एक स्ट्रिंग नल या खाली है या नहीं, यह जांचने के लिए एक अंतर्निहित फ़ंक्शन है?

मैं इसे अभी तक नहीं ढूंढ सका और अगर कोई अंतर्निहित तरीका है, तो मैं इसके लिए एक फ़ंक्शन नहीं लिखना चाहता हूं।



8
वैसे आप .NET का उपयोग कर रहे हैं, तो क्या आप कॉल नहीं कर सकते String.IsNullOrEmpty?
जॉन स्कीट

जवाबों:


471

आप IsNullOrEmptyस्थैतिक विधि का उपयोग कर सकते हैं :

[string]::IsNullOrEmpty(...)

3
मुझे इस तरह से अधिक पसंद है क्योंकि यह स्पष्ट है कि यह आपके पॉवरहेल ज्ञान की परवाह किए बिना क्या करता है, जो गैर-पॉवर्स प्रोग्रामर्स के लिए समझ में आता है।
पेंसिलकेक

18
मुझे लगता है कि आप बस कर सकते हैं! $ Var
Shay Levy

4
पॉवरशेल के साथ एक बात का ध्यान रखें कि एक कमांड या फंक्शन में जाने वाले अशक्त तार अशक्त न रहें। वे खाली तारों में परिवर्तित हो जाते हैं। Connect.microsoft.com/PowerShell/feedback/details/861093/… पर Microsoft कनेक्ट बग देखें ।
जेमीसेई

25
[स्ट्रिंग] पर विचार करें :: IsNullOrWhiteSpace (...) खाली स्थानों को भी मान्य करने के लिए।
साईं

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
@ पेंसिल पेंसिल हां, जो मैं कह रहा हूं और ऊपर का उदाहरण इसे कार्रवाई में दिखाता है। क्या परीक्षण IsNullOrWhitespace () के लिए जाँच नहीं करेगा।
कीथ हिल

3
मैं स्क्रिप्टिंग दृष्टिकोण से बेहतर इस समाधान से सहमत हूं। हमेशा की तरह, कीथ हिल के पास सही समाधान है! धन्यवाद।
विप्पी

2
आप सुरुचिपूर्ण कहते हैं, लेकिन किसी कारण से, यह जेएस जैसा लगता है।
डैन एटकिंसन

2
@VertigoRay ऊपर मेरी पहली टिप्पणी देखें जहां मैं IsNullOrWhitespace()उस परिदृश्य के लिए उपयोग करने की सलाह देता हूं । लेकिन पॉवरशेल के साथ स्क्रिप्टिंग के 11 साल बाद, मुझे लगता है कि मुझे उस स्ट्रिंग टेस्ट की बहुत कम जरूरत है । :-)
कीथ हिल

3
"कीथहिल। क्षमा करें कि यह अभी भी असुरक्षित है, चूंकि आपका इरादा स्पष्ट नहीं है। जब आप [स्ट्रिंग] :: IsNullOrEmpty का उपयोग करते हैं, तो आप बिल्कुल स्पष्ट हैं। IMO, पॉवर्सहेल एक अजीब रचना है - अधिकांश समय यह अत्यधिक रूप से समृद्ध होता है, लेकिन फिर भी। । लापता अनिवार्य -isNullOrEmpty विधेय उनमें से एक है ...
दिमित्री

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]पर्याप्त होगा।
च.आदि

20

यदि यह किसी फ़ंक्शन में एक पैरामीटर है, तो आप इसे ValidateNotNullOrEmptyइस उदाहरण के साथ देख सकते हैं:

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

    #stuff todo
}

10

निजी तौर पर, मैं व्हॉट्सएप ($ 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'}

खाली नहीं


5

मेरे पास एक पॉवरशेल स्क्रिप्ट है जिसे मुझे एक कंप्यूटर पर चलाना है, ताकि उसमें [स्ट्रिंग] :: IsNullOrWhiteSpace () न हो, इसलिए मैंने अपना लिखा।

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

PowerShell 2.0 के लिए प्रतिस्थापन [string]::IsNullOrWhiteSpace()हैstring -notmatch "\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

शुद्ध पॉवरशेल तरीके से इसे पूरा करने का एक और तरीका कुछ इस तरह होगा:

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

आप क्या करने की कोशिश कर रहे हैं पर निर्भर करता है।


1

ध्यान दें कि "if ($str)"और "IsNullOrEmpty"परीक्षण सभी उदाहरणों में समान रूप से काम नहीं करते हैं: $str=0दोनों के लिए असत्य का उत्पादन करने का एक असाइनमेंट , और इच्छित कार्यक्रम शब्दार्थ के आधार पर, यह एक आश्चर्य पैदा कर सकता है।


$ str = 0 एक अच्छा कोडिंग अभ्यास नहीं है। $ str = '0' IsNullOrEmpty के अपेक्षित परिणाम में कोई संदेह नहीं है।
दिमित्री

-1

लंबाई जांचें। यदि वस्तु मौजूद है, तो उसकी लंबाई होगी।

अशक्त वस्तुओं की कोई लंबाई नहीं है, मौजूद नहीं है, और जाँच नहीं की जा सकती है।

स्ट्रिंग ऑब्जेक्ट की लंबाई है।

सवाल यह था: 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
आरई Null objects have no length- क्या आपने निष्पादन की कोशिश की है $null.length? :-) एक त्वरित बूल परीक्षण के लिए, गेट-मेंबर में पाइपिंग करना और फिर $ null मामले के लिए परिणामी त्रुटि को संभालना है जो मुझे थोड़ा भारी लगता है।
कीथ हिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.