Geek School تعلم كيفية استخدام وظائف في PowerShell
يحتوي PowerShell على أربعة أنواع من الوظائف - وظائف في الخلفية ، وظائف عن بعد ، وظائف WMI والوظائف المجدولة. انضم إلينا لمعرفة ما هي وكيف يمكننا استخدامها.
تأكد من قراءة المقالات السابقة في السلسلة:
- تعلم كيفية أتمتة ويندوز مع PowerShell
- تعلم استخدام Cmdlets في PowerShell
- تعلم كيفية استخدام الكائنات في PowerShell
- تعلم تنسيق وتصفية ومقارنة في PowerShell
- تعلم كيفية استخدام الاتصال عن بعد في PowerShell
- استخدام PowerShell للحصول على معلومات الكمبيوتر
- العمل مع مجموعات في PowerShell
وتنبقي لبقية المسلسل طوال الأسبوع.
وظائف الخلفية
حتى الآن ، كان كل ما عرضته في PowerShell متزامناً ، مما يعني أننا نكتب شيئًا في الغلاف ولا يمكننا فعل الكثير حتى ينتهي هذا الأمر من التنفيذ. هذا هو المكان الذي تأتي فيه وظائف الخلفية. للبدء في خلفية ، ببساطة تمرير مهمة كتلة البرنامج النصي إلى الأمر cmdlet لـ Start-Job.
Start-Job -Name GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
الآن نحن أحرار في أن نفعل ما نريد داخل shell بينما يتم تنفيذ كتلة البرنامج النصي هذه في الخلفية.
عند بدء تشغيل مهمة جديدة ، يقوم PowerShell بإنشاء كائن مهمة جديد يمثل تلك المهمة. يمكنك الحصول على قائمة بجميع المهام في أي وقت عن طريق تشغيل الأمر cmdlet لـ Get-Job.
تخبرك الأجسام المهمة عن حالة الوظائف. على سبيل المثال ، في لقطة الشاشة أعلاه ، يمكننا أن نرى أن لدينا BackgroundJob يدعى GetFileList والذي لا يزال قيد التشغيل ، ولكنه بدأ بالفعل في عرض البيانات. إذا قررت في أي وقت أن الوظيفة قد تم تشغيلها لفترة طويلة ، يمكنك إيقافها بسهولة عن طريق توصيلها إلى Stop-Job.
Get-Job -Name GetFileList | توقف العمل
ومع ذلك ، فبمجرد توقفك عن العمل ، أيا كانت البيانات التي تتلقاها حتى النقطة التي قمت بإيقافها ، فستظل متاحة. هناك مسكتك ، على الرغم من. في PowerShell ، بمجرد الحصول على نتائج مهمة ، يتم حذفها. من أجل أن تبقى ، يجب عليك تحديد معلمة التبديل للحفاظ على وظيفة الاستلام.
Get-Job -Name GetFileList | تلقي وظيفة -Keep
بمجرد الانتهاء من العمل ، فمن الأفضل إزالته. لإزالة المهمة ، ما عليك سوى توجيهها إلى أمر Remove-Job cmdlet.
Get-Job -Name GetFileList | إزالة رأس العمل
سيؤدي ذلك إلى إزالته من قائمة المهام التي تم إرجاعها بواسطة Get-Job.
وظائف عن بعد
قبل بضع دروس ، نظرنا في كيفية استخدامنا للتزامن عن بُعد لتنفيذ أوامر PowerShell على جهاز بعيد باستخدام Invoke-Command ، ولكن هل تعلم أنه يمكنك أيضًا استخدام Invoke-Command لبدء مهمة الاتصال عن بُعد في الخلفية؟ للقيام بذلك ، ما عليك سوى إضافة المعلمة -AsJob إلى نهاية الأمر:
Invoke-Command -ComputerName Flash، Viper -Credential administrator -ScriptBlock gci -AsJob
كان ذلك أمرًا بسيطًا وكان من المفترض الانتهاء من التنفيذ الآن ، لذا دعنا نلقي نظرة على حالة مهامنا.
حسنًا ، يبدو أنها فشلت. هذا ينقلني إلى مساعدي الأول مع وظائف. عندما تقوم بإنشاء مهمة جديدة من أي نوع في PowerShell ، فإنها تقوم بإنشاء مهمة رئيسية واحدة بالإضافة إلى مهمة فرعية واحدة لكل كمبيوتر تقوم بتشغيل المهمة عليه. عند استخدام الأمر cmdlet لـ Get-Job ، فإنه يظهر لك المهام الأصل فقط ، وقيمة الحالة هي أسوأ سيناريو ، مما يعني أنه حتى إذا فشل الأمر في تشغيل واحد فقط من 100 جهاز كمبيوتر ، فستظهر حالة المهام الرئيسية فشل. لمشاهدة قائمة بالمهام الفرعية تحتاج إلى استخدام المعلمة IncludeChildJob.
إذا نظرت عن قرب ، سترى أن المهمة قد فشلت بالفعل على جهاز كمبيوتر واحد ، وهو ما يقودنا إلى مسكتك التالي. عند محاولة الحصول على نتائج المهمة ، إذا قمت بتحديد اسم أو معرف المهمة الخاصة بالأب أو الأم ، فسوف تقوم PowerShell بإرجاع البيانات من كافة المهام الفرعية. المشكلة هي أنه إذا كان هناك خطأ في إحدى مهام الطفل ، فسيتم تركه مع بعض النص الأحمر.
هناك طريقتان للالتفاف على هذا. أولاً ، إذا كنت تعرف ما هي أجهزة الكمبيوتر التي تريد الحصول عليها ، فيمكنك ببساطة استخدام المعلمة ComputerName الخاصة ببرنامج Recieve -Job cmdlet.
الحصول على وظيفة -Id 3 | تلقي وظيفة -Keep -ComputerName الأفعى
بدلاً من ذلك ، يمكنك الحصول على النتائج من مهمة فرعية معينة باستخدام معرف الوظيفة الخاص به.
الحصول على وظيفة -Id 3 -IncludeChildJob
الحصول على وظيفة -Id 5 | تلقي وظيفة -Keep
وظائف WMI
وظائف WMI تشبه إلى حد كبير وظائف Remote ، التي تتطلب إضافة المعلمة -AsJob إلى الأمر cmdlet Get-WmiObject.
لسوء الحظ ، وهذا يعني أنهم يخضعون أيضا لنفس المشاعر التي ذكرتها في قسم الوظائف عن بعد.
وظائف مجدولة
لم تكن الأنواع الثلاثة الأخيرة من الوظائف التي نظرنا إليها ثابتة ، بمعنى أنها لا تتوفر إلا في جلستك الحالية. وهذا يعني في الأساس أنك إذا بدأت وظيفة ثم فتحت بوحدة تحكم PowerShell أخرى وقمت بتشغيل Get-Job ، فلن ترى أي وظائف. ومع ذلك ، يمكنك الرجوع إلى وحدة التحكم التي طردت منها المهمة ، وستتمكن من رؤية حالتها. هذا على النقيض من الوظائف المجدولة التي هي مستمرة. بشكل أساسي ، مهمة مجدولة هي كتلة برنامج نصي يعمل على جدول زمني. في الماضي ، كان يمكن تحقيق نفس التأثير باستخدام برنامج جدولة مهام Windows ، وهو ما يحدث بالفعل تحت غطاء المحرك. لإنشاء مهمة مجدولة جديدة ، نقوم بما يلي:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
هناك الكثير مما يجري في هذا الأمر ، لذا دعونا نكسره.
- أولاً ، نعطي الوظيفة المجدولة لدينا اسم GetEventLogs.
- ثم نخبره أنه عندما يتم تشغيله ، فإننا نرغب في تشغيل محتويات كتلة البرامج النصية المحددة ، والتي تحصل بشكل أساسي على أحدث 100 إدخال من سجل أحداث الأمان.
- بعد ذلك ، نحدد المشغل. نظرًا لأن معلمة الزناد تأخذ عنصرًا مستقبلاً كمدخل ، فقد استخدمنا أمرًا بينيًا لتوليد مشغل ينطلق كل يوم في الساعة الخامسة مساءً.
- نظرًا لأننا نتعامل مع سجل الأحداث ، فنحن بحاجة إلى العمل كمسؤول ، يمكننا تحديده من خلال إنشاء كائن ScheduledJobOption جديد ونقله إلى معلمة ScheduledJobOption.
نظرًا لأن هذا نوعًا مختلفًا من الوظائف ، فستحتاج أيضًا إلى استخدام أمر مختلف لاسترداد قائمة بجميع المهام المجدولة على جهاز.
الحصول على لScheduledJob
هذا كل ما في الامر.