التعلم المهوس مدرسة تنسيق وتصفية والمقارنة في PowerShell
في هذه الطبعة من Geek School ، ننظر إلى تنسيق وترشيح ومقارنة الأشياء في خط الأنابيب.
تأكد من قراءة المقالات السابقة في السلسلة:
- تعلم كيفية أتمتة ويندوز مع PowerShell
- تعلم استخدام Cmdlets في PowerShell
- تعلم كيفية استخدام الكائنات في PowerShell
وتنبقي لبقية المسلسل طوال الأسبوع.
التنسيق الافتراضي
عندما بدأت العمل مع PowerShell لأول مرة ، اعتقدت أن كل شيء كان سحريًا ، ولكن الحقيقة هي أن الأمر يستغرق بعض الوقت لفهم ما يحدث أسفل الغطاء. وينطبق الشيء نفسه على نظام تنسيق PowerShell. في الواقع ، إذا قمت بتشغيل الأمر cmdlet Get-Service ، فإن الناتج الذي يتم إنشاؤه يظهر لك فقط 3 خصائص: Status و Name و DisplayName.
ولكن إذا قمت بتوجيه Get-Service إلى Get-Member ، سترى أن كائنات ServiceController تحتوي على أكثر من مجرد هذه الخصائص الثلاث ، لذا فما يحدث?
تكمن الإجابة في ملف مخفي يحدد كيفية عرض معظم أوامر cmdlets المضمنة لإخراجها. للحصول على فهم ، اكتب ما يلي في shell واضغط على Enter.
المفكرة C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ DotNetTypes.format.ps1xml
إذا استخدمنا وظيفة Find المفكرة ، فيمكننا الانتقال بسرعة إلى القسم الذي يوضح تفاصيل أمر cmdlet الخاص بالحصول على الخدمة من خلال البحث عن نوع ServiceController.
فجأة ، يمكنك أن ترى أنه تحت غطاء محرك السيارة PowerShell يقوم بتنسيق أي كائنات في Pipeline من نوع ServiceController وإنشاء جدول بثلاثة أعمدة: Status و Name و DisplayName. ولكن ماذا لو كان النوع الذي تتعامل معه لا يحتوي على إدخال في هذا الملف ، أو أي ملف تنسيق آخر لهذا الأمر؟ حسناً ، الأمر بسيط للغاية. إذا كان الكائن الخارج من خط الأنابيب يحتوي على 5 خصائص أو أكثر ، يعرض PowerShell جميع خصائص الكائن في قائمة ؛ إذا كان يحتوي على أقل من 5 خصائص ، فسيعرضها في جدول.
تنسيق البيانات الخاصة بك
إذا لم تكن راضيًا عن التنسيق الافتراضي لكائن أو نوع ، فيمكنك لف الصياغة الخاصة بك. هناك ثلاثة أوامر cmdlets تحتاج إلى معرفتها للقيام بذلك.
- تنسيق قائمة
- تنسيق الجدول
- الشكل على نطاق واسع
الشكل على نطاق واسع يأخذ ببساطة مجموعة من الكائنات ويعرض خاصية واحدة لكل كائن. بشكل افتراضي ، سيبحث عن خاصية اسم؛ إذا كانت الكائنات الخاصة بك لا تحتوي على خاصية اسم ، فستستخدم الخاصية الأولى للكائن بمجرد فرز الخصائص أبجديًا.
الحصول على الخدمة | الشكل على نطاق واسع
كما ترى ، يتم تعيينه أيضًا على عمودين افتراضيًا ، على الرغم من أنه يمكنك تحديد أي من الخصائص التي تريد استخدامها ، بالإضافة إلى عدد الأعمدة التي تريد عرضها.
الحصول على الخدمة | تنسيق-على نطاق واسع -Property DisplayName -Column 6
إذا تم تنسيق عنصر ما كجدول بشكل افتراضي ، فيمكنك دائمًا التبديل إلى عرض القائمة باستخدام الأمر cmdlet لـ Format-List. لنلقِ نظرة على مخرجات أمر الحصول على الأمر cmdlet.
هذه النظرة المجدولة تناسب بالفعل هذا النوع من المعلومات بشكل جيد ، لكن دعنا نتظاهر بأننا نريد مشاهدته في شكل قائمة. كل ما يتعين علينا فعله هو توجيه الأنبوب إليه تنسيق قائمة.
الحصول على العملية | تنسيق قائمة
كما ترى ، لا يوجد سوى أربعة عناصر معروضة في القائمة افتراضيًا. لعرض كافة خصائص الكائن ، يمكنك استخدام حرف بدل.
الحصول على العملية | تنسيق قائمة -Property *
بدلا من ذلك ، يمكنك تحديد الخصائص التي تريدها فقط.
الحصول على العملية | تنسيق قائمة ، اسم العقار ، معرف
تنسيق الجدول, من ناحية أخرى ، يأخذ البيانات ويحولها إلى جدول. نظرًا لأن بياناتنا من Get-Process هي بالفعل في شكل جدول ، فيمكننا استخدامه لاختيار الخصائص التي نريد عرضها في الجدول بسهولة. استخدمت معلمة AutoSize لجعل كافة البيانات مناسبة على شاشة واحدة.
الحصول على العملية | Format-Table name، id -AutoSize
التصفية والمقارنة
أحد أفضل الأشياء المتعلقة باستخدام خط أنابيب يستند إلى الكائن هو أنه يمكنك تصفية الكائنات خارج خط الأنابيب في أي مرحلة باستخدام أمر cmdlet لـ Where-Object.
الحصول على الخدمة | Where-Object $ _. Status -eq "Running"
باستخدام حيث الكائن في الواقع بسيط جدا. يمثل $ _ كائن خط الأنابيب الحالي ، والذي يمكنك من خلاله اختيار خاصية ترغب في تصفيتها. هنا ، يتم الاحتفاظ فقط بالكائنات حيث تساوي خاصية الحالة التشغيل. هناك بعض عوامل المقارنة التي يمكنك استخدامها في كتلة البرنامج النصي التصفية:
- مكافئ (يساوي)
- neq (لا يساوي)
- gt (أكبر من)
- ge (أكبر من أو يساوي)
- أقل من (أقل من)
- le (أقل من أو يساوي)
- مثل (Wildcard String Match)
يمكن الاطلاع على قائمة كاملة ومزيد من المعلومات في ملف المساعدة المفاهيمي about_comparison ، ومع ذلك يستغرق بعض الوقت التعود على بنية Where-Obeject. هذا كل هذا في هذا الوقت!