ค้นหาเว็บไซต์

คู่มือเริ่มต้นใช้งาน PowerShell Hashtable


เมื่อเจอกับ hashtable เป็นครั้งแรก คุณอาจสงสัยว่ามันคืออะไร และมันมีบทบาทสำคัญในสคริปต์หรือคำสั่งของคุณอย่างไร ไม่ต้องกังวล! บทช่วยสอนนี้ครอบคลุมถึงการเริ่มต้นใช้งาน PowerShell hashtable

โดยสรุป แฮชเทเบิลช่วยให้คุณสามารถจัดเก็บและจัดการข้อมูลโดยใช้คู่คีย์-ค่า ซึ่งสามารถเข้าถึงได้อย่างรวดเร็วและมีประสิทธิภาพ และในบทช่วยสอนนี้ คุณจะได้เรียนรู้พื้นฐานของแฮชเทเบิล และวิธีการใช้สำหรับสคริปต์และคำสั่ง PowerShell ของคุณ

อ่านต่อและเริ่มขยายทักษะของคุณด้วย PowerShell hashtables!

ข้อกำหนดเบื้องต้น

บทช่วยสอนนี้จะเป็นการสาธิตแบบลงมือปฏิบัติจริง เพื่อปฏิบัติตาม ตรวจสอบให้แน่ใจว่าคุณมีระบบที่ติดตั้งและกำหนดค่า PowerShell v5+ แล้ว บทช่วยสอนนี้ใช้ Windows 10 พร้อม PowerShell 7 แต่ PowerShell และ Windows เวอร์ชันอื่นจะใช้งานได้

การสร้าง PowerShell Hashtable

การดึงข้อมูลที่เฉพาะเจาะจงอาจกลายเป็นสถานการณ์ "เข็มในกองหญ้า" ได้ในบางจุด แต่ด้วยแฮชเทเบิล คุณสามารถค้นหารายการใดรายการหนึ่งในการรวบรวมข้อมูลอันกว้างขวางได้อย่างรวดเร็ว

ใน PowerShell แฮชเทเบิลเป็นโครงสร้างข้อมูลที่ยืดหยุ่นซึ่งใช้ในหลายๆ วิธี เช่น การจัดเก็บข้อมูลการกำหนดค่า การส่งอาร์กิวเมนต์ไปยัง cmdlets และการจัดเก็บข้อมูลในสคริปต์

หากต้องการดูว่า PowerShell hashtable ทำงานอย่างไร คุณจะต้องสร้างแฮชเทเบิลก่อนดังนี้:

1. เปิดเซสชัน PowerShell และเรียกใช้คำสั่งต่อไปนี้ ซึ่งไม่ได้สร้างเอาต์พุต แต่ประกาศตัวแปรชื่อ name เพื่ออ้างอิง hashtable ที่ว่างเปล่า

ดังที่คุณเห็นด้านล่าง เช่นเดียวกับอาร์เรย์ใน PowerShell แฮชเทเบิลถูกกำหนดโดยใช้สัญลักษณ์ @

$name = @{}

2. จากนั้น รันคำสั่งด้านล่างเพื่อตรวจสอบประเภทของตัวแปร name (GetType())

$name.GetType()

ประเภทของตัวแปร name คือ Hashtable ดังที่แสดงด้านล่าง ข้อมูลนี้ยืนยันว่าสร้างแฮชเทเบิลของคุณสำเร็จแล้ว

3. หลังจากตรวจสอบ hashtable ของคุณแล้ว ให้รันโค้ดต่อไปนี้เพื่อตรวจสอบว่า hashtable ว่างเปล่าหรือไม่

โค้ดด้านล่างนี้กำหนดว่าคุณสมบัติ Count เท่ากับ (-eq) ถึง 0 และพิมพ์ข้อความที่เกี่ยวข้อง

# Compare if the Count property value is equal (-eq) to 0
if ($name.Count -eq 0) {
	# If yes, print the below message.
  Write-Output "The hashtable is empty."
} else {
	# Otherwise, print the message below instead.
  Write-Output "The hashtable is not empty."
}

ด้านล่างนี้ คุณจะเห็นว่าแฮชเทเบิลว่างเปล่าตั้งแต่คุณเพิ่งสร้างขึ้น และไม่มีคู่คีย์-ค่าที่กำหนดไว้ในนั้น

การเพิ่มรายการลงใน PowerShell Hashtable

คุณเพิ่งสร้างแฮชเทเบิล PowerShell ที่ว่างเปล่า ซึ่งจะมีประโยชน์เฉพาะเมื่อคุณเพิ่มรายการเท่านั้น ยังไง? โดยการเพิ่มคู่คีย์-ค่าลงในแฮชเทเบิล

คล้ายกับอาร์เรย์ แต่แทนที่จะใช้จำนวนเต็มเป็นดัชนี PowerShell hashtable จะใช้คีย์ (ซึ่งอาจเป็นประเภทข้อมูลใดก็ได้) เพื่อระบุค่า คุณลักษณะนี้ช่วยให้สามารถแทรก ดึงข้อมูล และลบรายการออกจากแฮชเทเบิลได้อย่างรวดเร็ว เนื่องจากคีย์จะค้นหาค่าที่เกี่ยวข้องอย่างรวดเร็ว

ด้านล่างนี้คือไวยากรณ์สำหรับการเพิ่มคู่คีย์-ค่าลงในแฮชของ PowerShell โดยที่:

  • $hashtable - ชื่อของแฮชเทเบิล
  • $key - ชื่อของคีย์ซึ่ง ไม่คำนึงถึงขนาดตัวพิมพ์ ตัวอย่างเช่น “FirstName” และ “firstname” จะถือเป็นคีย์เดียวกันใน hashtable
  • $value - ค่าที่จะเชื่อมโยงกับคีย์
$hashtable[$key] = $value

เรียกใช้โค้ดต่อไปนี้ ซึ่งไม่ได้สร้างเอาต์พุตไปยังคอนโซล แต่ประกาศคู่คีย์-ค่า และเพิ่มลงในแฮชเทเบิลของคุณ ($name)

ในแฮชเทเบิล คีย์ช่วยให้คุณดำเนินการฟังก์ชันแฮช ซึ่งจะแมปคีย์ไปยังตำแหน่งเฉพาะในโครงสร้างข้อมูลภายในของแฮชเทเบิล

? ค่า Hashtable สามารถเป็นประเภทใดก็ได้ เช่น ตัวเลข สตริง อาร์เรย์ อ็อบเจ็กต์ และประเภทข้อมูลอื่นๆ เป็นค่าใน hashtable

# Declare the key FirstName
$key = "FirstName"
# Declare the value of the key
$value = "John"
# Add the item to the hashtable
$name[$key] = $value

# Declare the key LastName
$key = "LastName"
# Declare the value of the key
$value = "Doe"
# Add the item to the hashtable
$name[$key] = $value

ตอนนี้ให้รันโค้ดด้านล่างอีกครั้งเพื่อตรวจสอบว่า hashtable ของคุณว่างเปล่าหรือไม่

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

ดังที่แสดงด้านล่าง คุณจะได้รับข้อความแจ้งว่าแฮชเทเบิลไม่ว่างเปล่าในครั้งนี้

การดึงรายการจาก PowerShell Hashtable

สมมติว่าคุณมั่นใจว่าแฮชเทเบิลของคุณไม่ว่างเปล่า คุณจะรู้ได้อย่างไรว่ามีรายการใดอยู่ในแฮชเทเบิลของคุณ? โชคดีที่คุณสามารถดึงไอเท็มจากแฮชเทเบิลของคุณได้เช่นกัน

เรียกใช้โค้ดด้านล่างเพื่อดึงและส่งออก (Write-Output) รายการทั้งหมดจากแฮชเทเบิลของคุณในคู่คีย์-ค่า หนึ่งรายการต่อบรรทัด

# Iterates through all the key-value pairs in the hashtable
foreach ($key in $name.Keys) {
	$value = $name[$key]
  # Outputs all the key-value pairs in the hashtable, one per line.
	Write-Output "${key}: ${value}"
}

ตอนนี้ ให้รันโค้ดด้านล่างเพื่อดึงและพิมพ์ (Write-Output) รายการทั้งหมดในแฮชเทเบิลไปยังคอนโซล

? โปรดทราบว่าคุณมักจะใช้โค้ดต่อไปนี้ผ่านบทช่วยสอนนี้ คุณสามารถหลีกเลี่ยงการคัดลอกและวางโค้ดเดียวกันหลายครั้งได้โดยการสร้างฟังก์ชัน แต่อยู่นอกขอบเขตของบทช่วยสอนนี้

# Get an object that can be used to iterate over the elements of a collection.
$enumerator = $name.GetEnumerator()
foreach ($element in $enumerator) {
	# Outputs a string that includes the key and value of each element in the collection.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

คราวนี้ คุณจะเห็นตัวบ่งชี้ว่าคีย์และค่าใดในรายการที่แสดง

การสร้าง Hashtables ด้วยค่าที่กำหนดไว้ล่วงหน้า

จนถึงตอนนี้ คุณได้ดูแค่การสร้างแฮชเทเบิลที่ว่างเปล่าเท่านั้น แต่ถ้าคุณรู้ว่าค่าบางอย่างเป็นสิ่งจำเป็นใน hashtable ของคุณเสมอ คุณสามารถสร้างค่าหนึ่งที่มีค่าที่กำหนดไว้ล่วงหน้าได้

แฮชเทเบิลที่มีค่าที่กำหนดไว้ล่วงหน้าสามารถช่วยคุณประหยัดเวลาและทำให้โค้ดของคุณมีประสิทธิภาพมากขึ้น เนื่องจากคุณไม่จำเป็นต้องเพิ่มค่าลงในแฮชเทเบิ้ลในภายหลัง

? โปรดทราบว่าการสร้างแฮชเทเบิลไม่ได้สร้างผลลัพธ์ แต่ไม่ต้องกังวล ในบทช่วยสอนนี้ คุณจะตรวจสอบการสร้างโพสต์แฮชเทเบิลแต่ละรายการ

1. เรียกใช้คำสั่งด้านล่างเพื่อสร้าง hashtable ($hashtable1) ที่มีคู่คีย์-ค่าสามคู่

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

2. จากนั้น รันโค้ดต่อไปนี้เพื่อตรวจสอบว่ามี hashtable ใหม่ (hashtable1) อยู่

# Get an object that can be used to iterate over the elements of a collection.
$enumerator = $hashtable1.GetEnumerator()
foreach ($element in $enumerator) {
  # Outputs a string that includes the key and value of each element in the collection.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

คุณจะเห็นว่าค่าสำหรับคู่คีย์-ค่าแต่ละคู่ถูกพิมพ์บนหน้าจอตามที่คาดไว้ ผลลัพธ์นี้ยืนยันว่าค่าที่กำหนดไว้ล่วงหน้าถูกจัดเก็บไว้ในตำแหน่งที่เหมาะสมในแฮชเทเบิ้ล

3. ตอนนี้ ให้รันโค้ดด้านล่างเพื่อสร้าง hashtable ($hashtable2) ที่มีค่าที่กำหนดไว้ล่วงหน้าโดยใช้ลูป (หรืออาร์เรย์)

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

4. สุดท้าย เรียกใช้โค้ดด้านล่างเพื่อตรวจสอบว่าสร้าง hashtable ใหม่ (hashtable2) สำเร็จแล้ว

# Get an object that can be used to iterate over the elements of a collection.
$enumerator = $hashtable2.GetEnumerator()
foreach ($element in $enumerator) {
	# Outputs a string that includes the key and value of each element in the collection.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

ผลลัพธ์ด้านล่างยืนยันว่าวิธีการวนซ้ำใช้งานได้เมื่อสร้าง hashtable ด้วยค่าที่กำหนดไว้ล่วงหน้า แต่เนื่องจากรายการต่างๆ จะถูกแสดงรายการแบบสุ่ม ให้ข้ามไปที่ส่วนต่อไปนี้เพื่อรับการแก้ไข

การสร้างรายการเรียงลำดับของรายการใน Hashtables

ตามค่าเริ่มต้น รายการในแฮชเทเบิลจะถูกจัดเก็บโดยไม่มีลำดับใดเป็นพิเศษ แต่ถ้าคุณต้องการรายการสั่งซื้อล่ะ? คุณยังสามารถสร้างรายการเรียงลำดับของรายการในแฮชเทเบิลของคุณเพื่อจัดเรียงข้อมูลตามลำดับเฉพาะได้

หากต้องการสร้างรายการเรียงลำดับของรายการในแฮชเทเบิลของคุณ ให้ใช้แอตทริบิวต์ [ordered] ดังต่อไปนี้:

1. เรียกใช้โค้ดต่อไปนี้เพื่อสร้างรายการ [ordered] ของรายการใน hashtable ($hashtable3)

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

2. จากนั้น รันโค้ดต่อไปนี้เพื่อตรวจสอบว่ารายการแฮชเทเบิลที่เรียงลำดับได้ถูกสร้างขึ้นสำเร็จแล้ว

# Get an object that can be used to iterate over the elements of a collection.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Outputs a string that includes the key and value of each element in the collection.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

ดังที่แสดงด้านล่าง รายการยังคงอยู่ในลำดับที่คุณกำหนดไว้เมื่อคุณสร้างแฮชเทเบิล

ประโยชน์ที่เป็นไปได้บางประการของการใช้ order hashtable รวมถึงแต่ไม่จำกัดเพียง:

Benefits

คำอธิบาย

Easier to read and debug

องค์ประกอบต่างๆ จะแสดงตามลำดับที่คาดเดาได้ ซึ่งจะมีประโยชน์อย่างยิ่งหากคุณทำงานกับองค์ประกอบต่างๆ ของ Hashtable ขนาดใหญ่

Improved performance

แฮชเทเบิลที่เรียงลำดับจะมีประสิทธิภาพมากกว่าเมื่อเข้าถึงองค์ประกอบบ่อยครั้งในลำดับเฉพาะ

3. สุดท้าย โทรไปที่ hashtable ที่คุณสั่งซื้อ ($hashtable3) เพื่อยืนยันเพิ่มเติมว่าคุณจะยังคงได้รับรายการสินค้าที่สั่งซื้อ

$hashtable3

ผลลัพธ์ด้านล่างนี้ยืนยันว่าคุณจะยังคงได้รับรายการสั่งซื้อของรายการต่างๆ ไม่ว่าคุณจะเข้าถึงแฮชเทเบิลของคุณด้วยวิธีใดก็ตาม

การอัปเดตรายการที่มีอยู่ใน Hashtables

ข้อมูลเปลี่ยนแปลงอยู่ตลอดเวลา และหากคุณมีแฮชเทเบิลอยู่แล้ว การอัปเดตข้อมูลเหล่านั้นถือเป็นงานที่สำคัญ ตัวอย่างเช่น คุณกำลังใช้แฮชเทเบิลเพื่อจัดเก็บค่าการกำหนดค่า หากเป็นเช่นนั้น คุณอาจต้องอัปเดตค่าของคีย์หากการกำหนดค่าเปลี่ยนแปลง

หากต้องการอัปเดตแฮชเทเบิลของ PowerShell ตัวดำเนินการกำหนด = จะดำเนินการดังนี้:

1. เรียกใช้คำสั่งด้านล่าง ซึ่งไม่มีเอาต์พุต แต่อัปเดตค่าของคีย์ Key2 ใน $hashtable3 เป็น NewValue2

$hashtable3["Key2"] = "NewValue2"

จากนั้น รันคำสั่งด้านล่างเพื่อ Add() คู่คีย์-ค่าใหม่ (Key4=NewValue4 ไปยัง hashtable ($hashtable3)

การเพิ่มคู่คีย์-ค่าใหม่ไม่ได้สร้างผลลัพธ์เหมือนกับการอัปเดตรายการที่มีอยู่ในแฮชเทเบิล แต่คุณจะต้องตรวจสอบการเปลี่ยนแปลงในขั้นตอนต่อไปนี้

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

3. เรียกใช้โค้ดต่อไปนี้เพื่อตรวจสอบว่าค่าของคีย์ใน hashtable ของคุณ ($hashtable3) ได้รับการอัปเดตแล้ว

# Get an object that can be used to iterate over the elements of a collection.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Outputs a string that includes the key and value of each element in the collection.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

? ใน PowerShell แต่ละคีย์ในแฮชเทเบิลจะต้องไม่ซ้ำกัน หากคุณลองเพิ่มคู่คีย์-ค่าใน hashtable อยู่แล้ว คุณจะได้รับข้อผิดพลาดเหมือนกับข้อผิดพลาดด้านล่าง เพื่อหลีกเลี่ยงไม่ให้ได้รับข้อผิดพลาดนี้ ให้ข้ามไปยังขั้นตอนต่อไปนี้

4. ตอนนี้ ให้รันโค้ดต่อไปนี้ ซึ่งใช้เมธอด Contains() เพื่อตรวจสอบว่าคีย์ที่คุณพยายามเพิ่มมีอยู่แล้วในแฮชเทเบิล ก่อนที่จะเพิ่มคู่คีย์-ค่า

# Define the variable to hold the new key
$newkey="Key5"
# Check if $newkey already exists in the hashtable.
if (-not $hashtable3.Contains($newkey)) {
	# If not, add the new key-value pair.
	$hashtable3.Add($newkey, "NewValue5")
	Write-Output "The new key '$newkey' has been added to the hashtable."
} else {
	# If the key exists, print a message.
	Write-Output "The key '$newkey' already exists."
}

หากไม่มีคีย์ใหม่ คุณจะได้รับข้อความด้านล่างโดยบอกว่ามีการเพิ่มคีย์ใหม่ลงในแฮชเทเบิลแล้ว

มิฉะนั้น ดังที่แสดงด้านล่าง คุณจะได้รับข้อความหากรหัสที่คุณพยายามมีอยู่แล้ว

5. สุดท้าย รันโค้ดด้านล่างอีกครั้งเพื่อดึงข้อมูลรายการทั้งหมดใน hashtable ของคุณ ($hashtable3)

# Get an object that can be used to iterate over the elements of a collection.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Outputs a string that includes the key and value of each element in the collection.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

ด้านล่างนี้ คุณจะเห็นคีย์ที่เพิ่มใหม่ (Key5) และรายการอื่นๆ ที่คุณได้เพิ่มลงใน hashtable

การลบรายการออกจาก Hashtable

มีรายการมากเกินไปในแฮชเทเบิล โดยเฉพาะรายการที่ไม่จำเป็น อาจทำให้เกิดความสับสนได้ การลบรายการที่ไม่เกี่ยวข้องหรือจำเป็นออกจาก hashtable ของคุณจะช่วยคุณได้

สมมติว่าแฮชเทเบิลของคุณมีรายชื่อผู้ใช้และข้อมูลของพวกเขา หากเป็นเช่นนั้น ให้ลบผู้ใช้ออกจากแฮชเทเบิลของคุณหากไม่ได้ใช้งานอีกต่อไป

เรียกใช้โค้ดด้านล่างเพื่อลบรายการเฉพาะ (Key1) ออกจาก hashtable ของคุณ ($hashtable3)

$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."
}

ด้านล่างเอาต์พุตจะพิมพ์ข้อความแจ้งว่าคีย์ถูกลบออกแล้ว แต่หากไม่มีคีย์ คุณจะได้รับข้อความแจ้งว่าไม่พบคีย์

ตอนนี้ให้รันโค้ดต่อไปนี้เพื่อตรวจสอบรายการทั้งหมดใน hashtable ของคุณและตรวจสอบว่าการลบรายการสำเร็จหรือไม่

# Get an object that can be used to iterate over the elements of a collection.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Outputs a string that includes the key and value of each element in the collection.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

ด้านล่างนี้ คุณสามารถตรวจสอบว่าคู่คีย์-ค่ากับคีย์ 'Key5' ไม่มีอยู่ในแฮชของคุณแล้ว

บทสรุป

ด้วยโครงสร้างคู่คีย์-ค่าและการเข้าถึงที่รวดเร็ว แฮชเทเบิลของ PowerShell จึงเหมาะอย่างยิ่งสำหรับการจัดการข้อมูลจำนวนมากในสถานการณ์ต่างๆ และในบทช่วยสอนนี้ คุณได้เรียนรู้วิธีสร้าง เพิ่ม อัปเดต และลบรายการออกจากแฮชเทเบิล ทั้งหมดนี้ทำให้คุณมีทักษะในการใช้แฮชเทเบิลอย่างมีประสิทธิภาพในสคริปต์ของคุณ

ทำไมไม่ลองพัฒนาทักษะที่เพิ่งได้มาไปสู่อีกระดับล่ะ? ลองรวมแฮชเทเบิลลงในสคริปต์ของคุณสำหรับงานขั้นสูง เช่น การจัดการและการแปลงข้อมูล หรือทดลองใช้การรวมแฮชเทเบิลกับโครงสร้างข้อมูลอื่นๆ ใน PowerShell เช่น อาร์เรย์และอ็อบเจ็กต์ เพื่อแก้ไขปัญหาที่ซับซ้อนมากขึ้น

บทความที่เกี่ยวข้อง