HOWTO · PowerShell

PowerShellでStringが空かどうかをチェックする

この記事では、PowerShellで与えられたStringがnullまたは空であるかどうかをチェックするために使用できるStringメソッドについて説明します。

このページの内容

PowerShellで入力を検証するときは、まず何を拒否するのかを決めます。$null、長さ0の文字列('')、空白文字だけのテキストは、それぞれ異なる状態です。最初の2つを調べるには[string]::IsNullOrEmpty()を使い、PowerShellの条件式での判定動作をそのまま利用したい場合は真偽値チェックを使います。空白だけの入力も空として扱うなら、トリミング後の長さを調べます。

$null、空文字列、空白文字を区別する

$nullは値がないことを表し、文字列ではありません。空文字列の文字数は0です。一方、' 'のような空白だけの文字列には、見た目が空白でも1文字以上が含まれます。通常のPowerShell変数アクセスでは、まだ値を代入していない変数も$nullとして評価されます。

入力規則に合わせてチェック方法を選びます。たとえば、必須の名前ならnull、空文字列、空白だけの入力を拒否することがあります。一方、空白にも意味がある値では、暗黙にトリミングしないようにします。

[string]::IsNullOrEmpty()でnullまたは空文字列を調べる

静的メソッド[string]::IsNullOrEmpty($value)は、値が$nullまたは長さ0の文字列の場合にtrueを返します。空白文字だけの文字列は空として扱いません。値がない場合と文字数が0の場合の両方を許可しないなら、明確な既定のチェック方法です。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

$value = 'PowerShell'
if ([string]::IsNullOrEmpty($value)) {
    'No value supplied.'
} else {
    "Value: $value"
}

この例ではValue: PowerShellと表示され、代入した値に対して空ではない場合の分岐に進みます。

簡潔なチェックにはPowerShellの真偽値判定を使う

PowerShellでは、条件式の中で$nullと''はfalseとして扱われるため、if (-not $value)を使うと、どちらの場合にも簡潔に対処できます。ただし、空白文字を含む文字列はtrueです。真偽値判定はその動作が目的に合う場合に便利ですが、「目に見える文字が含まれているか」を判定するものではありません。

この形式では、調べる値のすぐそばに分岐を置けます。個別の分類が不要で、スクリプト内でPowerShellの条件式への変換動作をそのまま使う場合に適しています。実際のスクリプトでは、true側で入力を求めたり、処理をスキップしたり、既定値を選んだりできます。もう一方の分岐では、渡された値を使って処理を続けられます。分岐内の処理はプログラムの規則に合わせてください。条件を一目で判別できる形にしたい場合は、前述の専用メソッドを使います。この例では一般的なテキスト値を使い、どちらの分岐に進むかを表示します。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

$value = 'PowerShell'
if (-not $value) {
    'Falsy value.'
} else {
    'Truthy value.'
}

この条件では、空白文字を含む文字列はtrue側の分岐に進みます。空白を空として扱う必要がある場合は、より限定的なチェックを使います。

空文字列との比較または文字数の確認を行う

長さ0の文字列と直接比較するには、$value -eq ''を使います。この比較だけでは、空白だけのテキストを空として判定できません。文字数を確認するには$value.Length -eq 0を使えますが、.Lengthにアクセスする前に$nullでないことを確認してください。

このセクションのコードと表示されるラベルや出力は英語のままです。

if ($null -ne $value -and $value.Length -eq 0) {
    'The value is an empty string.'
}

このガードにより、null値のプロパティにアクセスするのを防げます。規則にnullも含める場合は、[string]::IsNullOrEmpty()を使うと意図をより直接的に表せます。

空白だけの文字列は別にチェックする

空白だけの入力を空として扱うには、トリミングしてから結果の長さを確認します。トリミングで前後の空白は取り除かれますが、結果を代入しない限り、元の変数は変更されません。

このセクションのコードと表示されるラベルや出力は英語のままです。

$value = '   '
if ([string]::IsNullOrEmpty($value) -or $value.Trim().Length -eq 0) {
    'The value is null, empty, or whitespace-only.'
}

最初の条件は$nullの場合に短絡評価されるため、.Trim()が呼び出されるのはnull以外の値だけです。この方法ではnull、長さ0の文字列、空白だけの文字列をまとめて扱えます。それぞれを区別する必要がある場合は、1つの条件にまとめず個別に調べてください。

複数の文字列をまとめてチェックする

欠けている値が1つでもあれば同じ分岐に進めるには-orを使い、すべての値が条件を満たす必要がある場合は-andを使います。たとえば、次の条件はどちらかの入力がnullまたは空文字列かどうかを調べます。

このセクションのコードと表示されるラベルや出力は英語のままです。

$firstName = 'Ada'
$lastName = ''

if ([string]::IsNullOrEmpty($firstName) -or [string]::IsNullOrEmpty($lastName)) {
    'At least one name is missing.'
} else {
    'Both names are present.'
}

ここでは、$lastNameの文字数が0なので、値が欠けている場合の分岐に進みます。両方の値がnullまたは空文字列の場合にだけその分岐へ進むという規則であれば、-orを-andに置き換えます。どちらの判定でも空白だけの値を含めるには、それぞれの値にもトリミング後のチェックを適用します。