Geek School Working with Collections in PowerShell
نظرًا لأن PowerShell يستند إلى إطار .Net ويتضمن تقنيات أخرى مختلفة مثل WMI و CIM ، فهناك دائمًا أكثر من طريقة لإنجاز الشيء نفسه. انضم إلينا للمشاركة في هذا المقال القصير حيث نتعلم كيفية اختيار أفضل طريقة لإنجاز مهامنا.
تأكد من قراءة المقالات السابقة في السلسلة:
- تعلم كيفية أتمتة ويندوز مع PowerShell
- تعلم استخدام Cmdlets في PowerShell
- تعلم كيفية استخدام الكائنات في PowerShell
- تعلم تنسيق وتصفية ومقارنة في PowerShell
- تعلم كيفية استخدام الاتصال عن بعد في PowerShell
- استخدام PowerShell للحصول على معلومات الكمبيوتر
وتنبقي لبقية المسلسل طوال الأسبوع.
باستخدام Cmdlets دفعة
في وقت سابق من السلسلة ، عندما قدمنا لك خط الأنابيب ، أظهرنا لك كيف يمكنك أن تأخذ الأشياء التي تخرجها واحدة cmdlet وتمريرها كإدخال إلى cmdlet آخر باستخدام شيء من هذا القبيل:
الحصول على عملية - اسم المفكرة | توقف عملية
هذا من شأنه أن يقتل أي عملية باسم "notepad". ولكنك ربما تتساءل كيف تستطيع PowerShell قتل كل مثيل المفكرة بأمر واحد. تكمن الإجابة في مساعدة الأمر Stop-Process cmdlet.
مساعدة وقف العملية - كاملة
إذا نظرت إلى السطر الأخير من التعليمة البرمجية في قسم البنية ، يمكنك أن ترى أن معامل InputObject يقبل كائنًا من نوع Process [] ، وعندما ترى نوعًا متبوعًا بقوسين مربعين مثل ذلك يعني أن المعلمة تقبل واحد أو أكثر من النوع السابق. في هذه الحالة ، فإنه يقبل كائن عملية واحد أو أكثر. من الناحية الفنية ، يمكن أن نقول أن InputObject cmdlet يقبل عملية مجموعة مصفوفة. عندما يكون لديك أمر cmdlet يدعم عمليات الدفعات بهذه الطريقة ، استخدمها. هذا هو الاختيار رقم واحد.
باستخدام WMI
على الرغم من أن WMI ليست أفضل تكنولوجيا للشحن من مقر Microsoft ، إلا أنها تأتي في المرتبة الثانية في قائمة كيفية العمل مع مجموعات الكائنات. يمكننا بسهولة الحصول على قائمة العمليات قيد التشغيل من فئة Win32_Process مثل:
Get-WmiObject -Class Win32_Process
نظرًا لأن استعلام WMI يقوم بإرجاع نوع الكائن الخاص به ، فستحتاج إلى البحث عن طريقة يمكنها إيقاف العملية ، لذلك يتيح توجيه الإخراج إلى Get-Member.
Get-WmiObject -Class Win32_Process | الحصول على لعضو
يبدو أن أقرب طريقة هي طريقة الإنهاء ، لذا يجب أن تكون هي الطريقة. لاستدعاء طريقة على كائن WMI ، يمكنك ببساطة توجيهها إلى Invoke-WmiMethod وتحديد اسم الطريقة.
Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod -Name إنهاء
عظيم ، لقد فعلت هذه الحيلة. عندما تحصل على ReturnValue من 0 في WMI ، فقط تذكر أن الأمر تم تنفيذه بنجاح.
تعداد
فشل الأساليب الأخرى اثنين ، إذا كان لديك للقيام بشيء لحفنة من الكائنات يمكنك تعداد الكائن بأكمله والتصرف على كل كائن على حدة. أولاً ، عليك أن تجد الطريقة التي تستخدمها لإيقاف عملية واحدة.
الحصول على العملية | Get-Member -MemberType Method
مثالي ، يبدو أننا يمكن أن نستخدم طريقة القتل ثم نوصل الأنبوب إلى كائن ForEach-Object لقتلهم جميعًا.
الحصول على عملية - اسم المفكرة | ForEach-Object -Process $ _. Kill ()
هنا أخذنا جميع الكائنات العملية التي عاد إليها Get-Process ومررتها إلى الأمر cmdlet لـ ForEach-Object. مثل الكثير من أوامر cmdlet الخاصة بالأماكن ، قمنا بتمثيل كل كائن في خط الأنابيب باستخدام $ _ الذي تمكنا من الاتصال به بطريقة Kill (). مع كل ما يقال ويفعل ، تعد تعداد مجموعة أبطأ بكثير من الطرق المذكورة أعلاه ويجب استخدامها فقط كآخر نتيجة.
ملخص
اختيار واحد
الحصول على عملية - اسم المفكرة | توقف عملية
الاختيار الثاني
Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod -Name إنهاء
الاختيار الثالث
الحصول على عملية - اسم المفكرة | ForEach-Object -Process $ _. Kill ()
هذا كل شيء لهذا الوقت الناس ، أراك الأسبوع المقبل لمزيد من المرح PowerShell.