استخدام التنسيق والتصفية

مكتمل

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

«Filtering left»

في عبارة البنية الأساسية لبرنامج ربط العمليات التجارية، يكون معنى filtering left هو التصفية على النتائج التي تريدها في أقرب وقت ممكن. يمكنك التفكير في مصطلح left بمعنى مبكراً لأنه يتم تشغيل عبارات PowerShell من اليسار إلى اليمين. والفكرة هي جعل العبارة سريعة وفعالة من خلال التأكد من أن مجموعة البيانات التي تعمل فيها صغيرة قدر الإمكان. يأتي هذا المبدأ بالفعل حيز التنفيذ عندما تعمل أوامرك على مخازن بيانات أكبر أو عندما تعيد النتائج عبر الشبكة.

فكر في العبارة التالية:

Get-Process | Select-Object Name | Where-Object Name -eq 'name-of-process'

تعمل هذه العبارة على استرداد جميع العمليات على الجهاز أولاً. وتنتهي بتنسيق الاستجابة بحيث يتم سرد خاصية Name فقط. لا تتبع هذه العبارة مبدأ filtering left لأنها تعمل في جميع العمليات، وتحاول تنسيق الاستجابة، ثم تتمكن من إجراء التصفية في النهاية.

من الأفضل التصفية أولاً ثم التنسيق، كما هو الحال في العبارة التالية.

Get-Process | Where-Object Name -eq 'name-of-process' | Select-Object Name

في كثير من الأحيان، يكون أمر cmdlet، الذي يوفر التصفية، أكثر كفاءة من استخدام Where-Object. فيما يلي إصدار أكثر كفاءة من العبارة السابقة:

Get-Process -Name 'name-of-process' | Select-Object Name

في هذا الإصدار، تجري المعلمة -Name التصفية من أجلك.

التنسيق بشكل صحيح، التنسيق باعتباره آخر شيء تفعله

في حين أن filtering left يعني تصفية شيء في أقرب وقت ممكن في عبارة، يعني formatting right تنسيق شيء في أبعد وقت ممكن في العبارة. حسناً، ولكن لماذا أحتاج إلى التنسيق في وقت متأخر؟ الجواب هو لأن أوامر التنسيق تغير بنية العنصر الذي تحتوي عليه نتائجك بحيث لم تعد البيانات موجودة في نفس الخصائص. يؤثر هذا التغيير على قدرتك على استرداد المعلومات التي تريدها باستخدام أوامر التوجيه، Select-Objectأو عن طريق تكرار النتائج باستخدام foreach.

يؤدي التنسيق إلى تدمير الكائن الذي تتعامل معه. خذ في اعتبارك بالاستدعاء التالي على سبيل المثال:

Get-Process 'some process' | Select-Object Name, CPU | Get-Member

النوع الذي تحصل عليه هو System.Diagnostics.Process. والآن، قم بإضافة المنسق Format-Table مثل ذلك:

Get-Process 'some process' | Format-Table Name,CPU | Get-Member

مع التركيز فقط على الأنواع التي تحصل عليها مرة أخرى، لاحظ أنك تحصل على شيء مختلف:

TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupEndData

ما هي هذه الأنواع، ليس مهما لهذا الدرس. ما يجب إدراكه هو أنه عند استخدام أي نوع من أوامر التنسيق، تكون بياناتك مختلفة. وعندما يكون مختلفا، قد لا يحتوي على الأعمدة التي تهتم بها. دعونا نوضح بمثال:

Get-Process 'some process' | Select-Object Name, Cpu

يمنحك الأمر السابق نتيجة مع العمودين Name وCPU.

Name       CPU
----       ---
zsh  1.2984395
zsh  0.2522047
zsh  0.2486375
zsh  0.2683466
zsh  0.2681874
zsh  1.6799438
zsh  0.2909816
zsh  0.7855272

دعونا نستخدم التنسيق أولاً، ثم Select-Object لتوضيح ما قد يحدث إذا لم تقم بتنسيق آخر:

Get-Process 'some process' | Format-Table Name,CPU | Select-Object Name, CPU

وتبدو النتيجة الآن مثل ذلك:

Name CPU
---- ---

إنه فارغ، لأنه Format-Table حول الكائن الذي يحتوي على نتائجك عن طريق وضع البيانات في خصائص أخرى. بياناتك لم تضع، ولكن فقط خصائصك هي التي فقدت. يحاول أمر PowerShell السابق العثور على الخصائص ولكنه غير قادر على ذلك.

يجب أن تكون أوامر التنسيق هي آخر شيء تستخدمه في العبارة لأنها مخصصة لتنسيق الأشياء بشكل جيد لعرض الشاشة التقديمي. لا يقصد بها أن تستخدم كوسيلة لتصفية بياناتك أو فرزها.

أوامر التنسيق

ومن أوامر cmdlet الأكثر شيوعاً في استخدامهما لتنسيق المخرجات هما Format-Table وFormat-List. بشكل افتراضي، تعمل معظم أوامر cmdlet على تنسيق المخرجات في شكل جدول. إذا كنت لا تريد أن يعرض الإخراج الخاص بك خصائص في أعمدة، فاستخدم Format-List cmdlet لعملية إعادة تنسيقها كقوائم.