使用PowerShell Hashtable的初學者指南

初次遇到雜湊表,您可能會想知道它們是什麼,以及它們在您的腳本或命令中如何發揮關鍵作用。別擔心!本教程將幫助您開始使用 PowerShell 雜湊表。

簡而言之,雜湊表允許您使用鍵-值對來存儲和操作數據,這樣可以快速有效地訪問它們。在本教程中,您將學習雜湊表的基礎知識,以及如何在 PowerShell 腳本和命令中使用它們。

繼續閱讀,並開始擴展您的 PowerShell 雜湊表技能!

先備知識

本教程將進行實踐演示。請確保您的系統已安裝並配置了 PowerShell v5+。本教程使用帶有PowerShell 7的 Windows 10,但其他版本的 PowerShell 和 Windows 也適用。

創建 PowerShell 雜湊表

在某些情況下,檢索特定數據可能會變成“大海撈針”的情況。但是使用雜湊表,您可以快速搜索大量數據中的特定項目。

在 PowerShell 中,雜湊表是靈活的數據結構,可用於多種方式,例如存儲配置數據、傳遞參數給 cmdlet,以及在腳本中存儲數據。

要了解 PowerShell 雜湊表的工作原理,您首先需要創建一個,如下所示:

1. 開啟 PowerShell 會話,運行以下命令,該命令不會產生輸出,但會聲明一個名為name的變量來引用一個空的 hashtable。

如下所示,與 PowerShell 中的數組類似,hashtable 使用@符號定義。

$name = @{}

2. 接下來,運行以下命令來驗證name變量的類型(GetType())。

$name.GetType()

name變量的類型是Hashtable,如下所示。此信息確認了您的 hashtable 已成功創建。

Verifying the newly-created hashtable

3. 驗證您的 hashtable 後,運行以下代碼來檢查 hashtable 是否為空。

以下代碼確定Count屬性是否等於(-eq0,並打印相應的消息。

# 比較 Count 屬性值是否等於(-eq)0
if ($name.Count -eq 0) {
	# 如果是,打印以下消息。
  Write-Output "The hashtable is empty."
} else {
	# 否則,打印以下消息。
  Write-Output "The hashtable is not empty."
}

下面你可以看到哈希表是空的,因为你剛剛創建它,還沒有在裡面定義鍵值對。

Checking if the hashtable is empty or not

將項目添加到PowerShell哈希表

你剛剛創建了一個幾乎是空的PowerShell哈希表,只有在添加項目時才有用。如何添加呢?通過將鍵值對添加到哈希表中。

與數組類似,但是PowerShell哈希表使用鍵(可以是任何數據類型)來識別值。這個特性使得可以快速插入、檢索和刪除哈希表中的項目,因為鍵可以快速定位到相應的值。

下面是將鍵值對添加到PowerShell哈希表的語法,其中:

  • $hashtable – 哈希表的名稱。
  • $key – 鍵的名稱,它是大小寫不敏感的。例如,“FirstName”和“firstname”在哈希表中被視為相同的鍵。
  • $value – 要與鍵關聯的值。
$hashtable[$key] = $value

運行以下代碼,它不會在控制台輸出,但是它定義了鍵值對並將它們添加到你的哈希表($name)。

在哈希表中,鍵可以讓你執行哈希函數,將鍵映射到哈希表內部數據結構的特定位置。

? 哈希表的值可以是任何類型,例如數字、字符串、數組、對象和其他數據類型。

# 宣告鍵 FirstName
$key = "FirstName"
# 宣告鍵的值
$value = "John"
# 將項目新增至雜湊表
$name[$key] = $value

# 宣告鍵 LastName
$key = "LastName"
# 宣告鍵的值
$value = "Doe"
# 將項目新增至雜湊表
$name[$key] = $value

現在重新執行下面的代碼,檢查您的雜湊表是否為空。

if ($name.Count -eq 0) {
  Write-Output "The hashtable is empty."
} else {
  Write-Output "The hashtable is not empty."
}

如下所示,您將收到一條訊息,指出這次雜湊表不是空的。

Checking if the hashtable is empty or not

從 PowerShell 雜湊表擷取項目

假設您確信您的雜湊表不是空的。您如何知道雜湊表中存在哪些項目呢?幸運的是,您也可以從雜湊表中擷取項目。

執行下面的代碼,以鍵值對的形式擷取並輸出(Write-Output)雜湊表中的所有項目,每行一個。

# 遍歷雜湊表中的所有鍵值對
foreach ($key in $name.Keys) {
	$value = $name[$key]
  # 輸出雜湊表中的所有鍵值對,每行一個。
	Write-Output "${key}: ${value}"
}
Retrieving items from a PowerShell hashtable

現在執行下面的代碼,以擷取並將雜湊表中的所有項目列印(Write-Output)到控制台。

? 請注意,在本教程中,您將經常使用以下代碼。通過創建一個函數,您可以避免多次複製和粘貼相同的代碼,但這超出了本教程的範圍。

# 獲取可用於遍歷集合元素的對象。
$enumerator = $name.GetEnumerator()
foreach ($element in $enumerator) {
	# 輸出包括每個元素的鍵和值的字符串。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

這一次,您可以在列出的項目中看到哪些是鍵和值的指示。

Retrieving items from a PowerShell hashtable, indicating which are the keys and value pairs

使用預定義值創建哈希表

到目前為止,您只看過如何創建空的哈希表。但是,如果您知道在您的哈希表中始終需要某些值,您可以創建一個帶有預定義值的哈希表。

具有預定義值的哈希表可以節省您的時間,使您的代碼更高效,因為您不需要在以後將值添加到哈希表中。

? 請注意,創建哈希表不會產生輸出。但不用擔心,在本教程中,您將驗證每個哈希表的創建後的情況。

1. 執行以下命令創建一個具有三個鍵值對的哈希表($hashtable1)。

$hashtable1 = @{
  "Key1" = "Value1"
  "Key2" = "Value2"
  "Key3" = "Value3"
}

2. 接下來,執行以下代碼驗證新的哈希表(hashtable1)是否存在。

# 獲取可用於迭代集合元素的物件。
$enumerator = $hashtable1.GetEnumerator()
foreach ($element in $enumerator) {
  # 輸出包含集合中每個元素的鍵和值的字符串。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

您將看到每個鍵值對的值按預期在屏幕上打印出來。此輸出確認了預定的值存儲在哈希表中的適當位置。

Verifying that hashtable was created successfully with predefined values

3. 現在,運行以下代碼以使用循環(或數組)創建具有預定值的哈希表($hashtable2)。

$keys = "Key1", "Key2", "Key3"
$values = "Value1", "Value2", "Value3"
$hashtable2 = @{}
for ($i = 0; $i -lt $keys.Count; $i++) {
  $hashtable2[$keys[$i]] = $values[$i]
}

4. 最後,運行以下代碼來驗證新哈希表(hashtable2)已成功創建。

# 獲取可用於迭代集合元素的物件。
$enumerator = $hashtable2.GetEnumerator()
foreach ($element in $enumerator) {
	# 輸出包含集合中每個元素的鍵和值的字符串。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

以下輸出確認了使用循環方法創建具有預定值的哈希表的正常運作。但由於項目是隨機列出的,請跳轉到下一節進行修復。

Verifying the new hashtable was created successfully

在哈希表中創建有序項目列表

默認情況下,哈希表中的項目不以特定順序存儲。但如果您需要有序列表該怎麼辦?您也可以在哈希表中創建有序項目列表,以特定順序排列數據。

要在哈希表中創建有序項目列表,請按照以下方式使用[ordered] 屬性:

1. 執行以下代碼以創建一個包含散列表項目的有序列表($hashtable3)。

$hashtable3 = [ordered]@{
"Key1" = "Value3"
"Key2" = "Value2"
"Key3" = "Value1"
}

2. 接下來,執行以下代碼來驗證已成功創建了散列表的有序列表。

# 獲取可用於迭代集合元素的物件。
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# 輸出包含集合中每個元素的鍵和值的字串。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

如下所示,列出的項目保持在創建散列表時定義的順序。

使用有序散列表的一些可能好處包括但不限於以下:

Benefits Description
Easier to read and debug The elements are displayed in a predictable order, which can be especially useful if you work with many elements of a large hashtable.
Improved performance An ordered hashtable can be more efficient when accessing elements frequently in a specific order.
Verifying that the ordered list of hashtables has been created

3. 最後,調用您的有序散列表($hashtable3)以進一步確認您仍將獲得有序的項目列表。

$hashtable3

下面的輸出確認,無論您如何訪問散列表,您仍將獲得有序的項目列表。

Verifying the list of items is still in an ordered format

更新散列表中的現有項目

數據不斷變化,如果您有現有的散列表,則更新它們是一項至關重要的任務。例如,您正在使用散列表存儲配置值。如果是這樣,則可能需要在配置更改時更新鍵的值。

要更新 PowerShell 散列表,使用 = 分配運算符即可,如下所示:

1. 執行以下命令,該命令不提供輸出,但將 $hashtable3 中的 Key2 鍵的值更新為 NewValue2

$hashtable3["Key2"] = "NewValue2"

下一步,執行以下命令以在散列表($hashtable3)中Add()一個新的鍵-值對(Key4 = NewValue4)。

添加新的鍵-值對不會像更新散列表中現有列表那樣產生輸出,但您將在以下步驟中驗證更改。

$hashtable3.Add("Key4", "NewValue4")

3. 執行以下代碼以驗證散列表($hashtable3)中鍵的值是否已更新。

# 獲取可用於遍歷集合元素的對象。
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# 輸出包含集合中每個元素的鍵和值的字符串。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
Verifying the key values have been updated

? 在PowerShell中,散列表中的每個鍵都必須是唯一的。如果嘗試添加散列表中已有的鍵-值對,將收到如下錯誤。為避免此錯誤,跳至以下步驟。

Adding a key that already exists

4. 現在,執行以下代碼,使用Contains()方法檢查要添加的鍵是否已存在於散列表中,然後再添加鍵-值對。

# 定義變數以保存新的鍵
$newkey="Key5"
# 檢查 $newkey 是否已存在於散列表中。
if (-not $hashtable3.Contains($newkey)) {
	# 如果不存在,添加新的鍵-值對。
	$hashtable3.Add($newkey, "NewValue5")
	Write-Output "The new key '$newkey' has been added to the hashtable."
} else {
	# 如果鍵存在,輸出一條消息。
	Write-Output "The key '$newkey' already exists."
}

如果新鍵不存在,您將收到下面的消息,說明新鍵已添加到散列表中。

Checking if a key exists before adding it to the hashtable

否則,如下所示,如果您試圖使用的鍵已存在,則會收到一條消息。

Adding a key that already exists

5. 最後,重新運行下面的代碼以檢索散列表($hashtable3)中的所有項目。

# 獲取用於迭代集合元素的對象。
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# 輸出包含集合中每個元素的鍵和值的字符串。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

在下面,您可以看到新添加的鍵(Key5)以及到目前為止添加到散列表中的其他項目。

Checking all items listed in a hashtable

從散列表中刪除項目

散列表中的項目太多,特別是不必要的項目,可能只會導致混亂。從散列表中刪除不再相關或不再需要的項目將對您有所幫助。

假設您的散列表包含一個用戶列表及其信息。如果是這樣,如果用戶不再活躍,請從散列表中刪除用戶。

運行下面的代碼從散列表($hashtable3)中刪除特定項目(Key1)。

$key = "Key5"
if ($hashtable3.Contains($key)) {
  $hashtable3.Remove($key)
  Write-Output "The key-value pair with the key '$key' was removed from the hashtable."
} else {
  Write-Output "The key-value pair with the key '$key' was not found in the hashtable."
}

下面的輸出打印了一條消息,說明該鍵已被刪除。但是,如果該鍵不存在,則會收到一條消息,說明該鍵未找到。

Removing items from a hashtable

現在,運行以下代碼檢查散列表中的所有項目,並驗證項目是否成功刪除。

# 獲取用於迭代集合元素的對象。
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# 輸出包含集合中每個元素的鍵和值的字符串。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

以下,您可以验证在您的哈希表中,具有键‘Key5’的键值对已不再存在。

Verifying item deletion is successful

結論

憑藉鍵值對結構和快速訪問,PowerShell 哈希表非常適合在各種情境中管理大量數據。在本教程中,您學會了如何創建、添加、更新和刪除哈希表中的項目。所有這些都使您具備在腳本中有效使用哈希表的技能。

為什麼不將您新獲得的技能提升到更高水平呢?考慮將哈希表融入到您的腳本中,以執行更高級的任務,例如數據操作和轉換。或者試驗將哈希表與PowerShell中的其他數據結構結合,例如數組和對象,以解決更複雜的問題。

Source:
https://adamtheautomator.com/powershell-hashtable/