回答:
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()
シナリオで使用することをお勧めする上記の最初のコメントを参照してください。しかし、PowerShellで11年間スクリプトを作成した後、その文字列テストが必要だとわかりましたになることはほとんどありません。:-)
[string]::IsNullOrEmpty
nullまたは空かどうかを確認するために加えて、文字列をブール値に明示的またはブール式でキャストできます。
$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]
行うか行わなくても十分です。
個人的には、空白($ 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'}
空ではない
コンピューターで実行する必要がある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を処理しています(そうしないと、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())
あなたがやろうとしていることに応じて。
"if ($str)"
と"IsNullOrEmpty"
テストがすべてのインスタンスで同等に機能するわけではないことに注意してください。の割り当ては$str=0
両方に対してfalseを生成し、意図されたプログラムのセマンティクスによっては、これは驚きをもたらす可能性があります。
長さを確認してください。オブジェクトが存在する場合、オブジェクトには長さがあります。
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
Null objects have no length
実行してみました$null.length
か?:-)簡単なboolテストの場合、Get-Memberにパイプして、$ nullの場合に結果として生じるエラーを処理する必要があるので、私には少し重いようです。