الصفحة الرئيسية » howto » Geek School تعلم كيفية استخدام وظائف في PowerShell

    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

    هذا كل ما في الامر.