PowerShell におけるヌル変数

PowerShell は、値が null の $Null
オブジェクトを扱い、一部のコマンドは出力を生成する必要があります。エラーが発生した場合、値は null になり、スクリプト内でコマンドが値を生成するかどうかを確認するためのトラブルシューティングにも役立ちます。
この記事では、null 変数、PowerShell の異なる構文における null 変数の使用の影響、および null 値の確認方法について説明します。
PowerShell における Null 変数の紹介
NULL は未知または空の値と考えることができます。たとえば、変数は値またはオブジェクトが割り当てられるまで NULL です。
この変数は重要である可能性があります。なぜなら、一部のコマンドは値を必要とし、値が NULL の場合は失敗するからです。
$null
変数は、NULL を表すために使用される PowerShell の自動変数です。これを変数に割り当て、比較に使用し、コレクションの NULL のプレースホルダーとして使用できます。
PowerShell は $null
を NULL 値のオブジェクトとして扱います。したがって、この変数は他の言語から来た場合には期待とは異なる可能性があります。
PowerShell における Null 変数の影響
$null
値の動作は、コード内の出現場所によって異なる場合があります。NULL 変数が PowerShell スクリプトの異なる側面にどのように影響を与えるかを見てみましょう。
文字列への影響
文字列内で $null
を使用すると、それは空の文字列(または空白の値)になります。
$value = $null
Write-Output "The value is $value."
出力:
The value is .
スクリプトの明確さを維持するために、ログメッセージで使用する際には、特に変数の値が文字列の最後にある場合は、変数を角括弧([]
)で囲むことをお勧めします。
$value = $null
Write-Output "The value is [$value]"
出力:
The value is []
この方法は、空の文字列と $null
値を区別するのに役立ちます。
数式への影響
$null
変数を数式で使用すると、エラーが発生しない場合、結果は無効になります。 $null
変数は 0
に評価されることもあり、全体の結果が $null
になることもあります。
値の順序に基づいて 0
または $null
を生成する乗算に関するこの例を考えてみましょう。
$null * 5
$null -eq ( $null * 5 )
出力:
True
コレクションへの影響
コレクションは、インデックスを使用して値にアクセスすることを可能にします。null コレクションにインデックスを付けると、 "Cannot index into a null array"
というエラーが発生します。
$value = $null
$value[10]
出力:
Cannot index into a null array.
At line:2 char:1
+ $value[10]
+ ~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
ただし、コレクションがあり、コレクション内に存在しない要素を取得しようとする場合、$null
結果が得られます。
$array = @( 'one', 'two', 'three' )
$null -eq $array[100]
出力:
True
オブジェクトへの影響
指定されたプロパティのないオブジェクトのプロパティまたはサブプロパティにアクセスしようとすると、未定義の変数のように $null
変数が得られることがあります。この場合、値が $null
であろうと実際のオブジェクトであろうと関係ありません。
$null -eq $undefined.not.existing
出力:
True
メソッドへの影響
$null
変数でメソッドを呼び出すと、RuntimeException
例外がスローされます。
$value = $null
$value.toString()
出力:
You cannot call a method on a null valued expression.
At line:2 char:1
+ $value.toString()
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
"You cannot call a method on a null valued expression"
というフレーズに出くわすたびに、まず $null
値をチェックせずに変数でメソッドを呼び出している箇所をコード内で確認するようにという信号です。
PowerShell での Null 値の確認
PowerShell で Null 値を確認するための比較演算子 -eq
および -ne
の使用
PowerShell で $null
値を確認する場合、比較の左側に $null
変数を配置することがベストプラクティスとされています。この書き方のスタイルは、意図的であるだけでなく、PowerShell のベストプラクティスとしても受け入れられています。
ただし、$null
を右側に置くと予期しない結果が得られる状況もあります。次のコードを見て、結果を予測してみましょう。
if ( $value -eq $null ) {
'The array is $null'
}
if ( $value -ne $null ) {
'The array is not $null'
}
$value
を定義しない場合、最初のものは $true
に評価され、メッセージは The array is $null
になります。ここでの注意点は、両方の結果が $false
になるような $value
を作成することが可能であるということです。
出力:
The array is $null
この場合、$value
変数は $null
を含む配列です。
-eq
演算子は、配列内のすべての値をチェックし、一致する $null
を返します。これは $false
に評価されます。同様に、-ne
演算子は $null
値と一致しないすべてのものを返し、結果は得られず、(これも $false
に評価されます)。
したがって、どちらの条件も $true
ではなく、一方は $true
であると予想されるかもしれません。
PowerShell で Null 値を確認するための -not
演算子の使用
-not
演算子は、条件を否定する論理演算子です。変数に適用されると、変数が null ではないかどうかをチェックします。
$myVariable = $null
if (-not $myVariable) {
Write-Host "The variable is null."
}
このコードスニペットでは、$myVariable
という変数を null 値で初期化しています。-not
演算子は、if
文内で $myVariable
が null ではないかを確認するために使用されます。
条件が真の場合、スクリプトは if
文内のコードブロックを実行します。
出力:
The variable is null.
出力で示されているように、スクリプトは $myVariable
が null であることを認識し、"The variable is null"
というメッセージを出力します。
PowerShell で Null 値を確認するための IsNullOrEmpty()
メソッドの使用
IsNullOrEmpty()
は、System.String
クラスのメソッドであり、ネイティブの PowerShell メソッドではありません。異なるデータ型には、null または空の値を確認するための異なる方法があるかもしれません。
このコードでは、$myString
という変数を作成し、null または空の文字列を表す値 $null
を割り当てます。
続けて、[string]::IsNullOrEmpty($myString)
メソッドを使用して、$myString
が null または空であるかを確認します。このメソッドは.NET Framework の [string]
クラスの一部で、文字列が null または空の文字列であるかを判断するために使用されます。
$myString
が実際に null または空である場合、条件は真となり、スクリプトは"The string is null or empty."
を出力します。
$myString = $null
if ([string]::IsNullOrEmpty($myString)) {
Write-Host 'The string is null or empty.'
}
出力:
The string is null or empty.
$myString
は値 $null
が割り当てられているため、条件は真であり、メッセージが出力に表示されます。
PowerShell で Null 値を確認するための IsNullOrWhiteSpace()
メソッドの使用
IsNullOrWhiteSpace()
は、.NET Framework の System.String
クラスで利用可能な便利なメソッドで、文字列変数に対して呼び出すことで PowerShell でも使用できます。
このメソッドは、文字列が null、空、または空白文字のみで構成されているかどうかをチェックします。空白やタブしか含まない場合にも、文字列変数が実質的に空であるかどうかを確認したいときに便利です。
以下のコードでは、$myString
という変数を作成し、空白文字(スペース)のみを含む文字列を割り当てます。
次に、[string]::IsNullOrWhiteSpace($myString)
メソッドを使用して、$myString
が null であるか、空白のみを含むかを確認します。
$myString = $null
if ([string]::IsNullOrWhiteSpace($myString)) {
Write-Host 'The string is null or contains only whitespace.'
}
出力:
The string is null or contains only whitespace.
条件が真であるため($myString
は null である)、スクリプトは"The string is null or contains only whitespace."
を出力します。
このメソッドは、スペースやタブのために「空白」に見える場合であっても、文字列が本当に空であることを確認したいときに役立ちます。
結論
PowerShell スクリプトにおいて、$null
変数がどのように機能するかを理解することは重要です。なぜなら、異なる状況でスクリプトの動作に影響を与えることがあるからです。信頼性の高いスクリプトを作成するためには、$null
を左側に配置して null 値を正しく確認するようなベストプラクティスに従うことが良いアイデアです。
スクリプト作成が初めての方でも経験がある方でも、これらの詳細を知ることで PowerShell をより良く使用できるようになります。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn