PowerShell هو لغة قوية. ولكن ما الذي يجعل هذه اللغة البرمجية قوية؟ الأجسام في PowerShell. ما هي هذه الأجسام السحرية وكيف يعمل PowerShell معها؟ تابع لمعرفة المزيد.
PowerShell هي لغة برمجة موجهة للكائنات وشل. هذا يعتبر تغييرًا عن الشيل التقليدية مثل cmd و Bash. كانت هذه الشيل التقليدية تركز على النصوص أو السلاسل وعلى الرغم من أنها لا تزال مفيدة ، إلا أنها محدودة في إمكانياتها. تقريبًا كل شيء في PowerShell هو كائن.
في هذه المقالة ، ستتعلم بعض المفاهيم الرئيسية المتعلقة بالأجسام في PowerShell. بحلول نهاية هذه المقالة ، ستكون قد تعلمت كيفية تطبيق هذه المعرفة على البرمجة الخاصة بك من خلال أمثلة مفيدة ورسوم بيانية.
إذا كنت تفضل التعلم المرئي ، فلا تتردد في مشاهدة الفيديو المصاحب لهذه المقالة أدناه.
لذا استعد! ستحظى بتجربة لا تُنسى ستساعدك على إتقان مفهوم الأجسام في PowerShell!
المتطلبات المسبقة
في هذه المقالة ، ستتعلم عن الأجسام في PowerShell من خلال نهج عملي. إذا اخترت متابعة الأمثلة التي تحتوي على الشيفرة ، يجب أن يعمل Windows PowerShell 5.1 أو أي إصدار من PowerShell 6+. ومع ذلك ، سيتم تنفيذ جميع الأمثلة التي تراها على Windows 10 Build 1903 مع Windows PowerShell 5.1.
فهم تشريح الكائن
الكائنات موجودة في كل مكان في PowerShell. قد تتساءل عن نفسك “كيف يبدو الكائن؟” في هذا القسم الأول، ستحصل على نظرة عامة على مكونات الكائن. بمجرد أن تحصل على رؤية شاملة لما يجعل الكائن كائنًا، ستتمكن بعد ذلك من استكشاف بعض أمثلة الشفرة!
اكتشاف أعضاء الكائن بواسطة الأمر Get-Member
الكائنات لديها العديد من أنواع المعلومات المرتبطة بها. في PowerShell، يشار إلى هذه المعلومات أحيانًا بـ “أعضاء”. يعد عضو الكائن مصطلح عام يشير إلى جميع المعلومات المرتبطة بكائن.
لاكتشاف المعلومات حول كائن (الأعضاء)، يمكنك استخدام الأمر Get-Member. الأمر Get-Member هو أمر مفيد يسمح لك بالعثور على الخصائص والطرق المتاحة وما إلى ذلك لأي كائن في PowerShell.
على سبيل المثال، دعنا نفترض أنك ترغب في عرض الأعضاء لكائن معين تم إرجاعه عبر أمر Get-Service. يمكنك فعل ذلك عن طريق توجيه ناتج الأمر Get-Service إلى الأمر Get-Member كما هو موضح أدناه.
تعود إلى الأمر Get-Member. ستستخدمه كثيرًا في هذه المقالة.
يمكن توجيه أي أمر في PowerShell الذي ينتج ناتجًا إلى الأمر Get-Member. فقط تذكر أن تجعل هذا الأمر هو آخر أمر في سلسلة الأوامر حيث سيستبدل الناتج بناتجه الخاص.
أنواع الكائنات والفئات
من دون الخوض في تفاصيل كثيرة حول البرمجة الموجهة للكائنات، يحتوي كل كائن على “مخطط”. مخطط الكائن هو قالب يحتوي على المخطط الأساسي لإنشاء الكائن. يُطلق على هذا المخطط اسم النوع.
يحتوي كل كائن في PowerShell على نوع محدد. يحتوي كل كائن على مخطط من الذي تم إنشاؤه. يتم تحديد نوع الكائن بواسطة الفئة. اعتبر هذا المثال؛ 9 هو رقم، Bluegill هو سمكة، Labrador هو كلب، إلخ. الفئة تأتي قبل النوع.
الكائنات هي مثيلات للفئات ذات نوع معين.
لا تقلق بشأن الانغماس في هذا الموضوع. ما لم تكن مطورًا للبرمجيات، ربما لا يلزمك القلق كثيرًا بشأن الدلالات في هذه المرحلة. ومع ذلك، فإنه مفهوم مهم يجب معرفته على المستوى الأساسي.
الخصائص
أهم مفهوم يجب عليك فهمه حول الكائنات هو الخصائص. الخصائص هي سمات تصف الكائن. يمكن أن يحتوي الكائن على العديد من الخصائص المختلفة المرتبطة به، والتي تمثل سمات مختلفة.
واحدة من أسهل الطرق لاكتشاف الخصائص الموجودة على الكائنات هي استخدام الأمر Get-Member
. يمكنك أن ترى أدناه أنه باستخدام معامل MemberType
، سيقيد الأمر Get-Member
المخرجات المرجعة إلى الكائنات فقط. سترى أيضًا أنه يعرض نوع الكائن System.ServiceProcess.ServiceController أيضًا.

الآن أخذ مثال خدمة BITS التي تمت مناقشتها سابقًا وراجع القيم المحددة لخصائص تلك الكائن باستخدام الكود التالي. يتيح لك أمر Get-Member
العثور على أسماء الخصائص ولكن ليس القيم. ولكن باستخدام أمر Select-Object
في PowerShell ، يمكنك تفقد قيم الخصائص.
يمكنك أن ترى أن StartType
هي خاصية في الكائن. يحتوي الكائن المُرجع على العديد من الأعضاء المختلفة ولكن باستخدام أمر Select-Object
، فإنه يقتصر عرض النتائج على فقط تلك الخاصية.

الخصائص هي بلا شك المكون الأكثر شيوعًا في الكائن الذي ستتعامل معه في PowerShell.
الأسماء المستعارة
بعض الخصائص لها MemberType
من النوع Alias
. الأسماء المستعارة هي أسماء مستعارة لأسماء الخصائص. وفي بعض الأحيان يمكن أن تعطي الخصائص اسمًا أكثر بديهية.
يمكنك رؤية مثال على كائن يحتوي على أسماء مستعارة باستخدام أمر Get-Service
مرة أخرى على النحو الموضح أدناه. الخاصية Name
لها اسم مستعار وهو ServiceName
والخاصية RequiredServices
لها اسم مستعار وهو خاصية ServicesDependedOn
.

عندما يكون للخاصية اسم مستعار ، يمكنك الإشارة إلى قيمة تلك الخاصية باستخدام اسم المستعار بدلاً من الاسم الفعلي للخاصية. في هذا المثال ، فإن سمة وصفية مثل Name
و RequiredServices
هي أكثر بديهية وأسهل في الكتابة من ServiceName
و ServicesDependedOn
.
يمكنك رؤية مثال على الإشارة إلى هذه الأسماء المستعارة أدناه.
يجب أن ترى الناتج التالي. لاحظ مرة أخرى أنك تحافظ على رمز قصير ونظيف وموجز. المعلومات هي نفسها بغض النظر عن استخدام الاسم المستعار أو عدم استخدامه:

الأساليب
الخصائص هي جزء واحد فقط يشكل الكائن؛ الأساليب هي أيضًا مفهوم مهم لفهمه. الأساليب هي الإجراءات التي يمكن تنفيذها على الكائن. مثل الخصائص ، يمكنك اكتشاف الأساليب على كائن باستخدام cmdlet Get-Member
.
لتحديد ناتج Get-Member
إلى الأساليب فقط ، قم بتعيين قيمة المعلمة MemberType
إلى Method
كما هو موضح أدناه.

كمبتدئ ، ستستخدم الأساليب بكثرة أقل من الخصائص.
أنواع أعضاء أخرى
الخصائص والأساليب والأسماء المستعارة ليست هي الأنواع الوحيدة من الأعضاء التي يمكن أن يحتوي عليها كائن. ومع ذلك ، ستكون هذه هي الأنواع الأكثر شيوعًا بكثير التي ستعمل معها.
للاكتمال ، فيما يلي بعض الأنواع الأخرى من الأعضاء التي قد تواجهها.
- خاصية النص النصي – تستخدم لحساب قيم الخاصيات.
- خاصية الملاحظة – تستخدم لأسماء الخاصيات الثابتة.
- مجموعات الخصائص – هذه تشبه الأسماء المستعارة التي تحتوي على مجموعات من الخصائص. على سبيل المثال ، قمت بإنشاء خاصية مخصصة تسمى
Specs
لوظيفتكGet-CompInfo
. يعدSpecs
فعلاً مجموعة فرعية من الخصائص Cpu و Mem و Hdd و IP. الغرض الأساسي من مجموعات الخصائص هو توفير اسم خاصية واحدة لدمج مجموعة من الخصائص.
من المهم أيضًا أن نذكر مفهوم أحداث الكائنات. الأحداث خارج نطاق هذه المقالة.
العمل مع الكائنات في PowerShell
الآن بمجرد أن لديك فهم أساسي لمكونات الكائن ، دعنا نبدأ في التعامل مع الكود.
العديد من أوامر PowerShell تنتج الإخراج ولكن في بعض الأحيان لا تحتاج إلى رؤية كل هذا الإخراج. تحتاج إلى تحديد أو تلاعب بهذا الإخراج بطريقة ما. لحسن الحظ ، يحتوي PowerShell على عدة أوامر مختلفة تسمح لك بالقيام بذلك.
لنبدأ بمثال على تعداد جميع الخدمات على الكمبيوتر المحلي باستخدام cmdlet Get-Service
كما هو موضح أدناه. يمكنك رؤية العديد من الخدمات (الكائنات) التي تمت إرجاعها من خلال الإخراج.

التحكم في خصائص الكائن المُرجَع
مستمرين مع مثال Get-Service
، ربما لا تحتاج إلى رؤية كل خاصية. بدلاً من ذلك ، تحتاج فقط إلى رؤية الخصائص Status
و DisplayName
. لتحديد الخصائص المرجعة ، يُستخدم cmdlet Select-Object
.
سيؤدي الأمر Select-Object
إلى “تصفية” الخصائص المختلفة من العائدات إلى أنبوب PowerShell. لتصفية خصائص الكائنات المعادة، يمكنك استخدام المعلمة Property
وتحديد مجموعة مفصولة بفواصل من خصائص واحدة أو أكثر للعودة.
يمكنك أن ترى أدناه مثالًا على إعادة الخصائص Status
و DisplayName
فقط.

ترتيب الكائنات
ربما تقوم ببناء تقرير لعرض الخدمات وحالتها. لسهولة استيعاب المعلومات، ترغب في ترتيب الكائنات المعادة حسب قيمة خاصية Status
. للقيام بذلك، يمكنك استخدام أمر Sort-Object
.
يتيح لك أمر Sort-Object
جمع جميع الكائنات المعادة ثم إخراجها في الترتيب الذي تحدده.
على سبيل المثال، باستخدام المعلمة Property
في Sort-Object
، يمكنك تحديد خاصية واحدة أو أكثر في الكائنات الواردة من Get-Service
لترتيبها. ستمرر PowerShell كل كائن إلى أمر Sort-Object
ثم سترجعها مرتبة حسب قيمة الخاصية.
يمكنك أن ترى أدناه مثالًا على إعادة جميع كائنات الخدمة المرتبة حسب خاصية Status
وإعادتها بترتيب تنازلي باستخدام معلمة تبديل Descending
في Sort-Object
.

المعامل [
|
] في PowerShell هو واحد من بعض تقنيات استمرار السطر التي يجب استخدامها عند الضرورة. استخدمه بدلاً من backticks.
تصفية الكائنات
ربما قررت عدم رؤية جميع الخدمات على جهاز ما. بدلاً من ذلك، تحتاج إلى تقييد النتائج بواسطة معايير محددة. أحد الطرق لتصفية عدد الكائنات المُرجَعة هو باستخدام cmdlet Where-Object
.
في حين يحد منتج الأمر Select-Object
الإخراج إلى خصائص محددة، يحد منتج الأمر Where-Object
الإخراج إلى كائنات بأكملها.
يتمتع منتج الأمر Where-Object
بوظيفة مشابهة لـعبارة WHERE في SQL. حيث يعمل كمرشح للمصدر الأصلي لإرجاع كائنات معينة تطابق معيارًا محددًا.
ربما قررت أنك تريد فقط استرجاع الكائنات التي تحمل قيمة خاصية Status
تساوي “تشغيل” وفقط تلك التي تحمل قيمة خاصية DisplayName
تبدأ بحرف “أ”.
يمكنك رؤية في مقتطف الشفرة التالي إدراج إشارة إلى Where-Object
بين Select-Object
و Sort-Object
في ترتيب سلسلة الأوامر. باستخدام قيمة للكائن النصي مع شرط مطلوب تم إنشاؤه لكل كائن لتلبية من خلال معلمة FilterScript
، يمكنك تصميم أي نوع من الاستعلامات التي ترغب فيها.
تحقق من cmdlet
Format-Table
إذا كنت ترغب في تلاعب كيفية إرجاع النتائج إلى وحدة التحكم.

عد الكائنات المُرجَعة وحساب المتوسط.
تُرجِع أمر Get-Service
العديد من الكائنات المختلفة. باستخدام أمر Where-Object
، تمت تصفية جزء من تلك الكائنات ولكن بكمية كم؟ دعونا نقدم أمر Measure-Object
.
أمر Measure-Object
هو أمر PowerShell يمكنه، من بين العمليات الرياضية الأخرى، عد الكائنات التي يتلقاها عبر الأنبوب.
ربما تود معرفة عدد الكائنات التي يتم إرجاعها في النهاية بعد تنفيذ الأوامر المشتركة. يمكنك توجيه الناتج النهائي إلى أمر Measure-Object
لإيجاد إجمالي عدد الكائنات المرجعة كما هو موضح أدناه.
بمجرد انتهاء المعالجة من التنفيذ، سترون، في هذه الحالة، أن هناك 21 كائنًا تم إرجاعها في البداية بواسطة أمر Get-Service
.

ربما تبحث فقط عن إجمالي الكائنات المرجعة. نظرًا لأن أمر Measure-Object
يرجع إجمالي الكائنات الموجودة عبر خاصية Count
، يمكنك الإشارة إلى أمر Select-Object
مرة أخرى. ولكن هذه المرة، سترجع فقط خاصية Count
.

اتخاذ إجراءات على الكائنات باستخدام حلقات الكود
أثناء معالجة كل كائن عبر الأنبوب، يمكنك اتخاذ إجراء على كل كائن باستخدام حلقة الكود. هناك أنواع مختلفة من حلقات الكود في PowerShell ولكن بالاستمرار في أمثلة الأنبوب، دعونا نلقي نظرة على أمر ForEach-Object
.
يتيح لك أمر ForEach-Object
اتخاذ إجراء على كل كائن يتدفق إليه. يمكن تفسير هذا السلوك بشكل أفضل باستخدام مثال.
مواصلة استخدام مثال Get-Service
، ربما ترغب في العثور على جميع الخدمات على جهاز كمبيوتر يعمل بنظام Windows بأسماء تبدأ بـ “Windows” وتعمل. باستخدام cmdlet Where-Object
، يمكنك إنشاء الشروط كما فعلت سابقًا.
لكن الآن بدلاً من إرجاع كائنات كاملة أو حتى بعض الخصائص ، ترغب في إرجاع السلسلة <اسم_الخدمة> يعمل لكل كائن باستخدام الكود **Write-Host -ForegroundColor 'Yellow' <اسم_الخدمة> "يعمل"
.
أنت تقوم الآن بتلاعب في الإخراج وإنشاء سلسلة خاصة بك. الطريقة الوحيدة لفعل ذلك هي استخدام cmdlet ForEach-Object
كما هو موضح أدناه. يمكنك أن ترى أنه لكل كائن يتم إرجاعه عبر Where-Object
، يقوم PowerShell بتشغيل الكود Write-Host -ForegroundColor 'Yellow' $_.DisplayName "يعمل"
.

يعد cmdlet ForEach-Object
مفيدًا بعدة طرق. على سبيل المثال ، يمكنك بناء منطق إضافي لتعداد كل كائن خدمة تم العثور عليه وبناءً على قيمة الخاصية ، تغيير لون وصياغة سلسلة الإخراج أو حتى تنفيذ إجراء إضافي مثل بدء خدمة متوقفة.
تخيل الإمكانات التي يوفرها لك هذا! مع بعض التفكير والتخطيط ، يمكنك إنشاء نص يأخذ أمرًا وينفذه بسهولة عبر العديد من الكائنات.
مقارنة الكائنات
في بعض الأحيان ، قد تحتاج إلى النظر في كائنين ومقارنة قيم الخاصيات.
ربما لديك نظامان في شبكتك يكادان يكونان متطابقين تقريبًا. ومع ذلك، تواجه مشكلة تكوينية متوقعة في خدمة على أحد النظامين.
تستنتج أنه نظرًا لأن هذه الأنظمة في أجزاء مختلفة من الشبكة، فإنه سيتعين عليك استخدام أوامر عن بُعد لجمع المعلومات في جلسة PowerShell. تفتح المحرر المفضل لديك وتنشئ نصًا برمجيًا. يتصل هذا النص البرمجي، كما يمكنك رؤيته أدناه، بخادمين مختلفين ويعدد كافة العمليات على كل منهما.
لقد قمت الآن بالتقاط جميع العمليات على كل جهاز في المتغيرين $ProcA
و $ProcB
. الآن تحتاج إلى مقارنتهما. يمكنك أن تبحث يدويًا في كل مجموعة من العمليات أو يمكنك القيام بذلك بالطريقة السهلة واستخدام أمر يسمى Compare-Object
.
يتيح لك Compare-Object
مقارنة قيم خصائص كائنين مختلفين. يقرأ هذا الأمر البرمجي كل خاصية في كل كائن، ويراجع قيمهما ثم يعيد ما هو مختلف افتراضيًا وأيضًا ما هو متطابق.
لاستخدام Compare-Object
، حدد معلمتي ReferenceObject
و DifferenceObject
وحدد كل كائن كقيم للمعلمات كما هو موضح أدناه.
افتراضيًا، سيعيد Compare-Object
فقط الاختلافات في الكائنات المشار إليها بواسطة خاصية SideIndicator
. استخدم الرموز أو مؤشرات الجانب المستخدمة هي >
، <
، و =
لإظهار تطابق الكائنات المقارنة.

يمكنك استخدام معامل التبديل
IncludeEqual
مع الأمرCompare-Object
لإرجاع خصائص الكائن المتطابقة. إذا كان الأمر كذلك ، سترى==
كمؤشر جانبي. بالمثل ، يمكنك استخدامExcludeDifferent
لاستبعاد الاختلافات.
أمر Compare-Object
هو أمر مفيد جدًا. إذا كنت ترغب في معرفة المزيد ، تأكد من زيارة وثائق الإنترنت.
العمل مع الكائنات المخصصة
الآن بعد أن لديك فهم جيد لما هي الكائنات وكيف يمكنك العمل معها ، حان الوقت لإنشاء كائناتك الخاصة!
إنشاء كائنات مخصصة باستخدام الجداول المتجهة
طريقة واحدة لإنشاء كائنات مخصصة هي باستخدام الجداول المتجهة. الجداول المتجهة هي مجموعات من أزواج المفاتيح/القيم بالضبط ما تحتاجه لإنشاء خصائص لكائن.
لنبدأ بإنشاء كائن مخصص في PowerShell ببعض المفاتيح/القيم باستخدام جدول متجه. في المثال أدناه ، أنت تقوم بإنشاء جدول متجه. يمثل هذا الجدول المتجه كائنًا واحدًا وخصائصه. بمجرد تعريف جدول المتجه $CarHashtable
، يمكنك بعد ذلك استخدام PsCustomObject
تسريع النوع.
تعتبر مسرعة النوع “pscustomobject” وسيلة سريعة لإنشاء مثيل من صنف “pscustomobject”. يُطلق على هذا السلوك مصطلح التحويل.
بنهاية مقتطف الكود التالي، ستكون لديك كائن ($CarObject
) من نوع pscustomobject بخمسة خصائص تم تعيينها له.
بديلاً عن ذلك، يمكنك أيضًا استخدام أمر cmdlet New-Object
. باستخدام نفس الجدول المجمع، بدلاً من استخدام مسرع النوع pscustomobject، يمكنك القيام بذلك بالطريقة الطويلة باستخدام New-Object
. يتم عرض مثال على ذلك أدناه.
عند إنشاء $CarObject
، يمكنك الآن أن ترى أنه يمكنك الإشارة إلى كل خاصية تمامًا كما لو كانت قادمة من cmdlet PowerShell المدمج مثل Get-Service
.

إضافة وإزالة الخصائص
لا يمكنك فقط إنشاء كائنات مخصصة، ولكن يمكنك أيضًا إضافة خصائص لها. هل تتذكر استخدام cmdlet “Get-Member”؟ يوجد نسخة مشابهة لـ “Get-Member” تسمى “Add-Member”. لا يقوم cmdlet “Add-Member” بفحص الأعضاء، بل يقوم بإضافتها.
باستخدام كائن المخصص الذي تم إنشاؤه سابقًا كمثال، ربما ترغب في إضافة خاصية تاريخ الطراز إلى ذلك الكائن. يمكنك القيام بذلك عن طريق توصيل كائن إلى cmdlet “Add-Member” وتحديد:
- نوع العضو (في هذه الحالة
NoteProperty
) - اسم الخاصية (
السنة
) - قيمة الخاصية (
القيمة
)
يمكنك رؤية مثال على ذلك أدناه.
يمكنك رؤية أدناه مرة أخرى حيث يظهر تمامًا مثل أي خاصية أخرى.

يمكنك استخدام تقنيات مماثلة لإضافة العديد من أنواع الأعضاء المختلفة. إذا كنت ترغب في استكشاف المزيد بمفردك ، فتحقق من توثيق
أضف-عضو.
يمكنك بسهولة نفسها إزالة عضو من كائن. على الرغم من عدم وجود أمر أزل-عضو
، يمكنك لا تزال جعل ذلك يحدث عن طريق استدعاء طريقة Remove()
على الكائن كما هو موضح أدناه. ستتعرف على الأساليب في القسم التالي.
مقدمة سريعة عن الأساليب
طوال هذه المقالة ، كنت تعمل مع الخصائص. لقد قرأت قيم الخاصية ، وأنشأت خصائصك الخاصة وأضفتها وأزلتها. ولكنك لم تفعل الكثير في البيئة العمل. لم تقم بتغيير أي شيء على الخادم. دعنا نتخذ بعض التحركات مع الأساليب.
الأساليب تقوم بأداء بعض الإجراءات. تخزن الكائنات المعلومات بينما تقوم الأساليب باتخاذ إجراء.
على سبيل المثال ، قد تكون على دراية بأمر Stop-Service
. يتوقف هذا الأمر عن تشغيل خدمة Windows. للقيام بذلك ، يمكنك إرسال كائن من Get-Service
مباشرة إلى Stop-Service
لجعله يحدث.
يمكنك رؤية مثالاً أدناه لإيقاف خدمة BITS. يقوم هذا المثال بإيقاف خدمة BITS ثم يتحقق من الحالة للتأكد من أنها توقفت. لقد قمت باتخاذ إجراءين باستخدام cmdlets؛ إيقاف الخدمة والتحقق من الحالة.
بدلاً من تشغيل Get-Service
مرتين وتنفيذ أمر منفصل، Stop-Service
، يمكنك بدلاً من ذلك الاستفادة من الأساليب المدمجة في كائنات الخدمة. العديد من الكائنات لديها أساليب. في هذه الحالة، الأسلوب هو Stop-Service
ولا حاجة حتى للإشارة الثانية لـ Get-Service
.

عن طريق استدعاء الأساليب على كائن الخدمة نفسه، يمكنك إيقافها واسترداد الحالة المحدثة باستخدام كائن واحد فقط. يمكنك رؤية ذلك في الأمثلة أدناه. لاحظ أنه باستخدام الأساليب Stop()
و Start()
، يمكنك التحكم في الخدمة تمامًا مثل الأوامر التي تم تنفيذها.
لضمان تحديث قيمة خاصية Status
بعد تغيير حالة الخدمة، يمكنك استدعاء الأسلوب Refresh()
الذي يعمل مثل استدعاء آخر لأمر Get-Service
.
يجب أن ترى الناتج التالي:

لمزيد من المعلومات حول الطرق، تفضل بزيارة موضوع المساعدة حول_الطرق.
الاستنتاج
هناك العديد من الأشياء التي يمكنك القيام بها باستخدام الكائنات في PowerShell. كان هذا المقال مقدمة لتبدأ في تعلمها. في هذا المقال، تعلمت بعض الأساسيات حول ماهية الكائنات وكيفية اتخاذ إجراءات عليها وتلاعبها وإنشائها. رأيت بعض السيناريوهات المختلفة التي أظهرت لك كيفية أداء هذه المهام باستخدام أمثلة الشفرة. استمر في الهدوء وتعلم PowerShell. شكرًا لقراءتك!