دليل مبتدئ لاستخدام جدول التحكم في PowerShell

عندما تواجه الهاشتابلز لأول مرة ، قد تتساءل ما هي وكيف تلعب دورًا حاسمًا في البرامج النصية أو الأوامر الخاصة بك. لا تقلق! ستغطي هذه الدروس التعليمية بدء استخدام الهاشتابلز في PowerShell.

بشكل مبسط ، تتيح لك الهاشتابلز تخزين وتلاعب البيانات باستخدام أزواج المفاتيح-القيمة ، والتي يمكن الوصول إليها بسرعة وكفاءة. وفي هذه الدروس التعليمية ، ستتعلم أساسيات الهاشتابلز وكيفية استخدامها في البرامج النصية والأوامر الخاصة بك في PowerShell.

استمر في القراءة وابدأ في توسيع مجموعة مهاراتك مع الهاشتابلز في PowerShell!

المتطلبات المسبقة

سيتم تقديم هذه الدروس التعليمية كعرض توضيحي عملي. لمتابعة الدروس ، تأكد من أن لديك نظام مثبت ومكون PowerShell v5+ ومكون. تستخدم هذه الدروس التعليمية Windows 10 مع PowerShell 7 ، ولكن إصدارات PowerShell و Windows الأخرى ستعمل أيضًا.

إنشاء هاشتابلز في PowerShell

يمكن أن يتحول استرجاع البيانات المحددة إلى “البحث عن إبرة في كومة قش”. ولكن باستخدام الهاشتابلز ، يمكنك البحث بسرعة في عناصر معينة في مجموعة بيانات واسعة.

في PowerShell ، تعتبر الهاشتابلز هياكل بيانات مرنة تُستخدم بطرق عديدة ، مثل تخزين بيانات التكوين وتمرير الوسائط إلى cmdlets وتخزين البيانات في نص برمجي.

لرؤية كيفية عمل الهاشتابلز في PowerShell ، يجب عليك أولاً إنشاء واحدة على النحو التالي:

1. افتح جلسة PowerShell وقم بتشغيل الأمر التالي، الذي لا ينتج إخراجًا ولكن يعلن عن متغير يُسمى name للإشارة إلى جدول تجويف فارغ.

كما يمكنك رؤية أدناه، بشكل مشابه للمصفوفات في PowerShell، يتم تعريف الجداول التجويفية باستخدام الرمز @.

$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

إضافة العناصر إلى جدول التجزئة في باور شيل

لقد أنشأت للتو جدول تجزئة في باور شيل شبه فارغ ، والذي لا يمكن أن يكون مفيدًا إلا إذا قمت بإضافة العناصر. كيف؟ عن طريق إضافة أزواج مفتاح-قيم إلى جدول التجزئة.

شبيه بمصفوفة ، ولكن بدلاً من استخدام الأعداد الصحيحة كفهارس ، يستخدم جدول تجزئة باور شيل مفاتيح (التي يمكن أن تكون أي نوع من البيانات) لتحديد القيم. تتيح هذه الميزة إدخالًا سريعًا واستردادًا وحذف العناصر من جدول التجزئة ، حيث تحدد المفتاح بسرعة القيمة المقابلة.

فيما يلي بناء جملة لإضافة زوج مفتاح-قيم إلى جدول تجزئة في باور شيل ، حيث:

  • $hashtable – اسم جدول التجزئة.
  • $key – اسم المفتاح ، والذي غير حساس لحالة الأحرف. على سبيل المثال ، سيعتبر “الاسم الأول” و “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. قم بتشغيل الكود التالي لإنشاء قائمة [ordered] من العناصر في جدول التجزئة ($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"

ثم، قم بتشغيل الأمر أدناه لـ \code{Add()} زوج مفتاح-قيمة جديد (\code{Key4 = NewValue4} إلى الجدول المجزأ (\code{\$hashtable3}).

إضافة زوج مفتاح-قيمة جديد لا ينتج مخرجات مثل تحديث القوائم الموجودة في الجداول المجزأة، لكن ستتحقق من التغييرات في الخطوة التالية.

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

3. قم بتشغيل الكود التالي للتحقق من أن قيم المفاتيح في جدول المفاتيح الخاص بك (\code{\$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. الآن، قم بتشغيل الكود التالي، الذي يستخدم طريقة \code{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/