PowerShell 中的空變數
PowerShell 將值為 null 的 $Null 對象視為 null,某些命令需要一些輸出以生成。如果有任何錯誤,它們會生成 null 值,並且在腳本中檢查命令是否生成任何值時也可以幫助故障排除。
本文談論 null 變量、在 PowerShell 中使用 null 變量的不同語法的影響,以及檢查 null 值的方法。
PowerShell 中的 null 變量介紹
我們可以將 NULL 視為未知或空的值。例如,一個變量在您分配值或對象之前是 NULL。
這個變量可能很重要,因為某些命令需要一個值,如果該值為 NULL,則會失敗。
$null 變量是 PowerShell 中的一個自動變量,用於表示 NULL。我們可以將其分配給變量,將其用於比較,並在集合中用作 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 集合,我們將收到這個錯誤 "無法索引到 null 數組"。
$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
每當您遇到短語 "您無法在 null 值表達式上調用方法" 時,這是一個信號,提示您檢查您的代碼,查找在未先檢查 $null 值的情況下調用方法的地方。
在 PowerShell 中檢查 null 值
使用比較運算符 -eq 和 -ne 在 PowerShell 中檢查 null 值
在 PowerShell 中檢查 $null 值時,最佳做法是將 $null 變量放在比較的左側。這種寫作風格不僅是故意的,而且被接受為 PowerShell 的最佳實踐。
然而,在某些情況下,將 $null 放在右側可能會給您意想不到的結果。讓我們看以下代碼並嘗試預測結果:
if ( $value -eq $null ) {
'The array is $null'
}
if ( $value -ne $null ) {
'The array is not $null'
}
如果我們不定義 $value,第一個將評估為 $true,我們的消息將是 數組為 $null。此處的警告是,創建一個 $value 使得兩個結果都為 $false 是可能的。
輸出:
The array is $null
在這種情況下,$value 變量是一個包含 $null 的數組。
-eq 運算符檢查數組中的每個值並返回匹配的 $null,它評估為 $false。類似地,-ne 運算符返回所有不匹配 $null 值的結果,導致沒有結果(同樣評估為 $false)。
因此,無論哪一個條件都不是 $true,即使其中一個可能被期望為如此。
使用 -not 運算符在 PowerShell 中檢查 null 值
-not 運算符是 PowerShell 中的一個邏輯運算符,用於否定條件。當應用於變量時,它檢查該變量是否不為 null。
$myVariable = $null
if (-not $myVariable) {
Write-Host "The variable is null."
}
在這段代碼中,我們有一個初始化為 null 值的變量 $myVariable。-not 運算符在 if 語句中用於檢查 $myVariable 是否不為 null。
如果條件為真,則腳本將運行 if 語句中的代碼塊。
輸出:
The variable is null.
如輸出所示,腳本識別了 $myVariable 為 null,並輸出消息 "該變量為 null"。
使用 IsNullOrEmpty() 方法在 PowerShell 中檢查 null 值
IsNullOrEmpty() 是 System.String 類的一個方法,而不是本地 PowerShell 方法。不同的數據類型可能有不同的方法來檢查 null 或空值。
在這段代碼中,我們創建一個名為 $myString 的變量並將其賦值為 $null,表示一個 null 或空字符串。
我們使用 [string]::IsNullOrEmpty($myString) 方法來檢查 $myString 是否為 null 或空。這個方法是 .NET Framework 中 [string] 類的一部分,用於確定字符串是否為 null 或空字符串。
如果 $myString 確實為 null 或空,條件為真,腳本將打印 "字符串為 null 或空。" 。
$myString = $null
if ([string]::IsNullOrEmpty($myString)) {
Write-Host 'The string is null or empty.'
}
輸出:
The string is null or empty.
由於 $myString 被賦值為 $null,因此條件為真,消息會顯示在輸出中。
使用 IsNullOrWhiteSpace() 方法在 PowerShell 中檢查 null 值
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),腳本將打印 "字符串為 null 或僅包含空白。" 。
這個方法在您想確保字符串實際上是空的時候特別有用,即使它因為空格或製表符而顯得是 "空白"。
結論
在 PowerShell 腳本中,了解 $null 變量的工作原理很重要,因為它們可能會影響腳本在不同情況下的行為。為了編寫可靠的腳本,遵循最佳實踐是個好主意,例如確保通過將 $null 放在左側來正確檢查 null 值。
無論您是剛剛開始學習腳本編寫還是已有經驗,了解這些細節將幫助您更好地使用 PowerShell。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn