מדריך למתחילים לשימוש ב-PowerShell Hashtable

התקרבות ראשונה לטבלאות גיבוב במהלך הזמן, ייתכן שתתעניין מהן ואיך הן גורמות לשחק תפקיד מרכזי בתסריטים או בפקודות שלך. אל תדאג! במדריך הזה נדבך בתחילה של כיצד להשתמש בטבלאות גיבוב בפוורשל.

בקצרה, טבלאות הגיבוב מאפשרות לך לאחסן ולנהל נתונים באמצעות זוגות מפתח-ערך, שניתן לגשת אליהם במהירות וביעילות. ובמדריך זה, תלמד את היסודות של טבלאות הגיבוב וכיצד להשתמש בהן עבור תסריטים ופקודות שלך בפוורשל.

תמשיך לקרוא והתחל להרחיב את יכולותיך עם טבלאות הגיבוב של פוורשל!

דרישות מוקדמות

מדובר בהדגמה ידיים. כדי לעקוב, הקפד לוודא שיש לך מערכת עם PowerShell v5+ מותקן ומוגדר. המדריך משתמש ב- Windows 10 עם PowerShell 7, אך גרסאות אחרות של PowerShell ווינדוס יכולות לעבוד גם כן.

יצירת טבלאות הגיבוב בפוורשל

איתור נתונים ספציפיים יכול להפוך למצב "חיפוש לאחים בתירים" בפעמים רבות. אך עם טבלאות הגיבוב, תוכל לחפש במהירות פריטים מסוימים באוסף נתונים נרחב.

בפוורשל, טבלאות הגיבוב הן מבני נתונים גמישים המשמשים בכמה דרכים, כמו אחסון נתוני הגדרה, העברת ארגומנטים ל-cmdlets ואחסון נתונים בתסריט.

כדי לראות כיצד טבלאות הגיבוב בפוורשל עובדות, תצטרך תחילה ליצור אחת כמו שמתואר למעלה:

1. פתח ישיבת PowerShell, והרץ את הפקודה הבאה, שאינה מייצרת פלט אך מכריזה על משתנה בשם name להתייחס לטבלת ריקה.

כפי שאתה יכול לראות למטה, דומה למערכות בפוורשל, טבלאות מוגדרות באמצעות סמל ה-@.

$name = @{}

2. לאחר מכן, הרץ את הפקודה למטה כדי לאמת את סוג המשתנה name (GetType()).

$name.GetType()

סוג המשתנה name הוא Hashtable, כפי שמוצג למטה. המידע הזה מאשר שהטבלה שלך נוצרה בהצלחה.

Verifying the newly-created hashtable

3. לאחר אימות הטבלה שלך, הרץ את הקוד הבא כדי לבדוק האם הטבלה ריקה או לא.

הקוד למטה מקבע האם המאפיין Count שווה (-eq) ל-0, ומדפיס הודעה תואמת.

# השווה אם ערך המאפיין 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] = $value

הריץ את הקוד הבא, שאינו מייצר פלט לקונסולה אלא מגדיר זוגות מפתח-ערך ומוסיף אותם לטבלת העצות שלך ($שם).

בטבלה, המפתח מאפשר לך לבצע פונקציה של גיבוב, שממפה את המפתח למיקום מסוים במבנה הנתונים הפנימי של הטבלה.

? ערכי הטבלה יכולים להיות מכל סוג, כגון מספרים, מחרוזות, מערכים, אובייקטים וסוגים אחרים של נתונים כערכים בטבלה.

# הכרז על המפתח שם פרטי
$key = "FirstName"
# הכרז על הערך של המפתח
$value = "John"
# הוסף את הפריט לטבלת האש
$name[$key] = $value

# הכרז על המפתח שם משפחה
$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. להריץ את הפקודה למטה, שאינה מספקת פלט, אך מעדכנת את ערך המפתח Key2 בתוך $hashtable3 ל־NewValue2.

$hashtable3["Key2"] = "NewValue2"

שורה הבאה: הרץ את הפקודה למטה כדי להוסיף מפתח-ערך חדש (Add()) לטבלת האושר ($hashtable3).

הוספת מפתח-ערך חדש לא גורמת להפקיד כמו עדכון של רשימות קיימות בטבלה, אך תיאמת את השינויים בשלב הבא.

$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

הסרת פריטים מטבלת גיבורים

יש יתר פריטים בטבלת גיבורים, במיוחד פריטים מיותרים, שעשויים להוביל רק לבלבול. הסרת פריטים שאינם רלוונטיים או אינם נדרשים יותר מטבלת הגיבורים שלך תעשה לך טוב.

נניח שבטבלת הגיבורים שלך יש רשימה של משתמשים והמידע שלהם. אם כך, הסר משתמשים מטבלת הגיבורים שלך אם הם לא פעילים יותר.

הרץ את הקוד למטה כדי להסיר פריט ספציפי (Key1) מטבלת הגיבורים שלך ($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."
}

למטה, הפלט מדפיס הודעה שאומרת שהמפתח הוסר. אם המפתח אינו קיים, תקבל הודעה שאומרת שהמפתח לא נמצא.

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/