PowerShellで文字列がnullまたは空かどうかを確認するにはどうすればよいですか?


413

IsNullOrEmptyPowerShellで、文字列がnullまたは空かどうかを確認するための組み込みのような関数はありますか?

今のところそれを見つけることができませんでした。組み込みの方法がある場合は、このための関数を記述したくありません。



8
さてあなたは.NETを使用しているので、呼び出すことはできませんString.IsNullOrEmptyか?
Jon Skeet

回答:


471

IsNullOrEmpty静的メソッドを使用できます。

[string]::IsNullOrEmpty(...)

3
Powerhsellの知識に関係なくそれが何をするのかは明らかなので、この方法がより好きです。
pencilCake

18
$ var
Shay Levy

4
PowerShellについて知っておくべきことの1つは、コマンドレットまたは関数に渡されるnull文字列はnullのままではないということです。それらは空の文字列に変換されます。connect.microsoft.com/PowerShell/feedback/details/861093/…で Microsoft Connectのバグを参照してください。
JamieSee 2014

25
空のスペースを検証するためにも[String] :: 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
@pencilCakeはい、私が言っていることと上の例は、実際にそれを示しています。テストがチェックしないのはIsNullOrWhitespace()です。
キース・ヒル

3
スクリプティングの観点からは、この解決策に同意します。いつものように、キースヒルは正しい解決策を持っています!ありがとう。
Vippy

2
あなたはエレガントだと言いますが、何らかの理由で、これはJSのように感じます。
Dan Atkinson

2
@VertigoRay上記のIsNullOrWhitespace()シナリオで使用することをお勧めする上記の最初のコメントを参照してください。しかし、PowerShellで11年間スクリプトを作成した後、その文字列テストが必要だとわかりましたになることはほとんどありません。:-)
キース・ヒル

3
「KeithHill。意図が明確でないため、それでもまだ安全ではありません。[string] :: IsNullOrEmptyを使用すると、完全に明確になります。IMO、Powershellは奇妙な作成物です-ほとんどの場合、豊富にありますが、 Essentialsがありません。-isNullOrEmpty述語はその1つです...
ドミトリー

40

[string]::IsNullOrEmptynullまたは空かどうかを確認するために加えて、文字列をブール値に明示的またはブール式でキャストできます。

$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 2016年

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

コンピューターで実行する必要があるPowerShellスクリプトがあるため、[String] :: 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"

( " \ 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を処理しています(そうしないと、Trimが呼び出されたときに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両方に対してfalseを生成し、意図されたプログラムのセマンティクスによっては、これは驚きをもたらす可能性があります。


$ str = 0は良いコーディング方法ではありません。$ str = '0'は、IsNullOrEmptyの予期される結果に疑問を残しません。
ドミトリー

-1

長さを確認してください。オブジェクトが存在する場合、オブジェクトには長さがあります。

nullオブジェクトは長さがなく、存在せず、チェックできません。

文字列オブジェクトには長さがあります。

問題は次のとおりです:IsNullまたはIsEmpty、NOT 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か?:-)簡単なboolテストの場合、Get-Memberにパイプして、$ nullの場合に結果として生じるエラーを処理する必要があるので、私には少し重いようです。
キース・ヒル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.