تحديد البيانات

مكتمل

يمكن أن يكون تشغيل أحد الأوامر قوياً، حيث تحصل على البيانات من جهازك المحلي أو من عبر الشبكة. لكي تكون أكثر فعالية، تحتاج إلى معرفة كيفية الحصول على البيانات التي تريدها. تعمل معظم الأوامر على العناصر، كمدخلات أو مخرجات أو كلتيهما. تحتوي العناصر على خصائص، ومن المحتمل أنك تريد مجموعة فرعية من تلك الخصائص وتود تقديمها في التقارير على سبيل المثال. قد تحتاج أيضاً إلى فرز البيانات استناداً إلى خاصية واحدة أو أكثر. لكن كيف تبدأ؟

استخدام Get-Member لفحص الإخراج

عند تمرير نتائج أمر إلى Get-Member، Get-Member ترجع معلومات حول كائن، مثل:

  • نوع العنصر الذي يتم تمريره إلى Get-Member.
  • خصائص العنصر التي قد يتم تقييمها.
  • أساليب العنصر التي قد يتم تنفيذها.

دعونا نوضح هذه الحقيقة من خلال تشغيل Get-Member على الأمر Get-Process.

Get-Process | Get-Member

لاحظ كيف تستخدم الأنابيب | وأنه عن طريق استدعاء Get-Member، فأنت في الواقع تقوم بإنشاء مسار بالفعل. تبدو الأسطر القليلة الأولى من الإخراج من العبارة السابقة كما يلي:

TypeName: System.Diagnostics.Process

Name                       MemberType     Definition
----                       ----------     ----------
Handles                    AliasProperty  Handles = Handlecount
Name                       AliasProperty  Name = ProcessName
NPM                        AliasProperty  NPM = NonpagedSystemMemorySize64
PM                         AliasProperty  PM = PagedMemorySize64
SI                         AliasProperty  SI = SessionId
VM                         AliasProperty  VM = VirtualMemorySize64
WS                         AliasProperty  WS = WorkingSet64
...

يظهر الإخراج نوع العنصر الذي Get-Process يرجعه الأمر (System.Diagnostics.Process). تظهر بقية الاستجابة اسم أعضاء العنصر ونوعهم وتعريفهم. يمكنك أن ترى أنه إذا كنت تريد ملاءمة Get-Processمع أمر آخر في البنية الأساسية، فإن إقرانه مع Get-Member يعد خطوة أولى جيدة.

Select-Object

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

لا تحتوي طريقة العرض بشكل عام على جميع خصائص الكائن لأنه لن يتم عرضه بشكل صحيح على الشاشة، لذلك يتم تضمين بعض الخصائص الأكثر شيوعا فقط في طريقة العرض.

يمكنك تجاوز طريقة العرض الافتراضية باستخدام Select-Object، واختيار قائمة الخصائص الخاصة بك. يمكنك بعد ذلك إرسال هذه الخصائص إلى Format-Table أو Format-List، لعرض الجدول كيفما تشاء.

فكر في نتيجة تشغيل Get-Process على العملية zsh:

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.01       0.38     644 620 zsh
      0     0.00       0.01       0.38     727 727 zsh
      0     0.00       0.01       0.38     731 731 zsh
      0     0.00       0.01       0.38     743 743 zsh
      0     0.00       0.01       0.38     750 750 zsh
      0     0.00       0.88       0.91   15747 …47 zsh
      0     0.00       0.01       0.29   41983 …83 zsh
      0     0.00       1.16       0.31   68298 …98 zsh

ما تراه هو طريقة عرض تمثل ما تريد رؤيته على الأرجح من هذا الأمر. ومع ذلك، لا تظهر لك طريقة العرض هذه مجموعة كاملة من المعلومات. لكي ترى شيئًا مختلفًا، يمكنك تحديد الخصائص التي تريد رؤيتها في النتيجة بشكل صريح.

الحصول على الاستجابة الكاملة

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

Get-Process zsh | Format-List -Property *

* يعرض لك الحرف كل سمة وقيمتها، مما يسمح لك بالتحقيق في القيم التي تهتم بها. تستخدم الاستجابة الكاملة أيضًا أسماء العروض التقديمية للخصائص بدلاً من أسماء الخصائص الفعلية، وتبدو أسماء العروض التقديمية جيدة في التقرير.

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

تحديد أعمدة محددة

للحد من الاستجابة والعثور على أرضية وسط بين الاستجابة الافتراضية والاستجابة الكاملة، تريد تحديد بعض الخصائص التي تهتم بها وامتلاكها كإدخال معلمة إلى Select-Object. ولكن، وهنا تكمن مشكلة، تحتاج إلى استخدام الأسماء الحقيقية للأعمدة. كيف يمكنك معرفة الأسماء الحقيقية؟ استخدم Get-Member. يمنحك استدعاء Get-Member جميع الخصائص وأسمائها الفعلية.

العثور على اسم الخاصية الحقيقي

دعونا نستعرض الاستجابة الافتراضية بسرعة، باستخدام هذه المجموعة الفرعية:

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.01       0.38     644 620 zsh

من الاستجابة الافتراضية، من المرجح أن الخاصيتين Id وProcessName تحمل الاسم نفسه، ولكن المعالجات هي اسم عرض تقديمي، وتميل أسماء الخصائص الحقيقية إلى أن تتشكل من أحرف نصية فقط وبدون مسافات. لمعرفة الاسم الحقيقي لخاصية معينة، يمكنك استخدام Get-Member:

Get-Process zsh | Get-Member -Name C*

يمكنك الآن الحصول على قائمة بجميع الأعضاء الذين تبدأ أسماؤهم بـ C. ومن بينها CPU، وهو على الأرجح ما تريد:

TypeName: System.Diagnostics.Process

Name             MemberType     Definition
----             ----------     ----------
CancelErrorRead  Method         void CancelErrorRead()
CancelOutputRead Method         void CancelOutputRead()
Close            Method         void Close()
CloseMainWindow  Method         bool CloseMainWindow()
Container        Property       System.ComponentModel.IContainer Container {get;}
CommandLine      ScriptProperty System.Object CommandLine {get=…
Company          ScriptProperty System.Object Company {get=$this.Mainmodule.FileVersionInfo.CompanyName;}
CPU              ScriptProperty System.Object CPU {get=$this.TotalProcessorTime.TotalSeconds;}

أنت تعرف الآن كيفية استخدام Select-Object لطلب ما تحتاجه بالضبط مع أسماء الخصائص الصحيحة، مثل ذلك:

Get-Process zsh | Select-Object -Property Id, Name, CPU

وهي كذلك:

Id Name       CPU
-- ----       ---
644 zsh  0.3812141
727 zsh  0.3826498
731 zsh  0.3784953
743 zsh  0.3776352
750 zsh  0.3824036
15747 zsh  0.9097993
41983 zsh  0.2934763
68298 zsh  0.3121695

يمنحك هذا التسلسل من الأوامر إخراج يختلف عن الإخراج الافتراضي ولكنه يحتوي على الخصائص التي تهتم بها.

الفرز

عند استخدام Sort-Object في البنية الأساسية لبرنامج ربط العمليات التجارية، يقوم PowerShell بفرز بيانات الإخراج باستخدام الخصائص الافتراضية أولا. إذا لم توجد مثل هذه الخصائص، فسيحاول حينها مقارنة العناصر نفسها. الفرز إما بترتيب تصاعدي أو تنازلي.

من خلال توفير الخصائص، يمكنك اختيار الفرز حسب أعمدة معينة، مثل:

Get-Process | Sort-Object -Descending -Property Name

في الأمر السابق، نقوم بالفرز حسب العمود Name بترتيب تنازلي. للفرز حسب أكثر من عمود، افصل أسماء الأعمدة بفاصلة، مثل:

Get-Process | Sort-Object -Descending -Property Name, CPU

بالإضافة إلى الفرز حسب اسم العمود، يمكنك أيضًا توفير التعبير المخصص الخاص بك. في هذا المثال، نستخدم تعبيرًا مخصصًا للفرز حسب العمودين Name وCPU والتحكم في ترتيب الفرز لكل عمود.

Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}

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