الحصول على عنصر الطفل: قائمة الملفات والمجلدات باستخدام PowerShell

تذكر أيام DOS الجيدة مع أمر dir؟ ماذا عن أمر Linux ls؟ إذا كان الأمر كذلك، فإن Get-childItem هو في الأساس ذلك ولكن بمستوى أعلى.

في الواقع، لدينا حتى dir و ls في PowerShell في شكل اختصار. يمكن لأمر Get-Childitem في PowerShell ليس فقط قائمة الملفات والمجلدات على نظام الملفات عبر وحدة التحكم PowerShell أو نص PowerShell ولكن يمكنه أيضًا عداد مفاتيح السجل والقيم، والشهادات في مخازن الشهادات المختلفة وحتى Active Directory، لنذكر بعضها.

إذا كنت مبتدئًا/متوسطًا في كتابة السيناريوهات باستخدام PowerShell، تأكد من التحقق من دورتي المجانية عن بناء أداة PowerShell! أكثر من 9,000 كلمة تشرح وتقدم رؤى عميقة حول كيفية بناء أداة PowerShell.

لفهم Get-Childitem، أولاً، فكر فيه فيما يتعلق بأمر dir و ls ولكن بدلاً من الملفات فإنه يعامل العديد من الكائنات كعنصر فرعي ويعدها. يمكنك استخدام الاختصار أو اسم الأمر الكامل لاستخدامه.

نظرًا لأن هذا الأمر متاح منذ PowerShell v1، يمكنك التأكد من أنه سيعمل مع إصدار PowerShell الذي تستخدمه.

يعبر Get-ChildItem عن شجرة

A file system is a hierarchy. It has a folder structure with files inside of folders and those folders inside of other folders. A file system is like a tree. That tree has a trunk (C:\ for example) and “branches” coming off of it (folders). In fact, we even have a tree command.

PS> tree
Folder PATH listing for volume HD
Volume serial number is 0000007B 22DC:666C
C:.
 \modules
   \AdsiPS
     \1.0.0.2
       \Public
       \AWSPowerShell
<SNIP>

يمكنك توجيه هذا الأمر إما إلى مسارات محلية على الكمبيوتر المحلي، استخدام كتلة نص PowerShell عن بُعد واستخدام Get-ChildItem في داخلها أو توجيهه إلى مسار UNC. كلها تعمل بنفس الطريقة. ربما أريد فقط قائمة بجميع الملفات في الدليل الحالي.

PS> dir -Path .
PS> Invoke-Command -ComputerName SERVER1 -Scriptblock { dir -Path . }

مزودات PowerShell

مايكروسوفت أدركت أن التنقل في هذه الهيكلية “شجرة” لنظام الملفات يمكن تطبيقه على أنظمة أخرى أيضًا. يحتوي نظام ملفات “شجرة” على مجلدات وملفات، ولكن السجل لديه مفاتيح وقيم بينما نظام الشهادات في ويندوز لديه متاجر وشهادات داخل تلك المتاجر. يمكن تمثيل كل من هذه المناطق الخاصة بشكل شجري، ومن هنا جاء مزود PowerShell. لماذا كل هذا الحديث عن مزودات PowerShell؟ لأن الأمر \texttt{Get-ChilldItem} جزء من الأوامر \texttt{*-Item} التي تتفاعل مع محركات PowerShell التي يعرض كل مزود منها.

يمكن للأمر \texttt{Get-ChildItem} إخراج أي عدد من الكائنات على محرك PowerShell ويتيح لك معالجة كل عنصر عبر الأنبوبة أو ربما في حلقة \texttt{foreach} في PowerShell. فهو يفهم مفهوم محرك PowerShell الذي يتيح لك تحديد مسار مجلد نظام ملفات أو مفتاح سجل أو مخزن شهادات كلها في مكان واحد.

يمكنك أن ترى أدناه أن هذا الأمر يمكنه فهرسة المجلد \diy5{C:\}، جذع HKEY Current User وكذلك مخزن شهادات PowerShell.

PS> Get-ChildItem -Path C:\


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         7/2/2017   7:01 AM                AppData
d-----        4/25/2017   4:36 PM                CheckPoint

PS> Get-ChildItem -Path HKCU:\


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
BCD00000000

PS> dir -Path Cert:\


Location   : CurrentUser
StoreNames : {TrustedPublisher, ClientAuthIssuer, Root, UserDS...}

التصفية

لا يمكن لأمر الباورشيل Get-ChildItem سحب الكائنات فقط على محرك أقراص ولكن يمكنه أيضًا تصفية المعلومات من خلال عدة معلمات مختلفة: Filter، Include و Exclude. سترغب دائمًا في استخدام معلمة الباورشيل الواسعة الانتشار Filter عند الإمكان. تمر هذه المعلمة مباشرة بصيغة التصفية إلى موفر الكائن الفردي. على الرغم من أن هذه الصيغة أسرع بكثير، فإن هذه الصيغة تعتمد بشكل كامل على موفر الذي يتم استعلامه.

على سبيل المثال، فإن صيغة Filter Name -eq 'foo' قد تكون مقبولة تمامًا عند الاستعلام عن الملفات ولكنها لن تعمل على الإطلاق عند الاستعلام عن التسجيل لأن موفر التسجيل ليس لديه حتى تصفية!

PS> dir HKLM:\ -Filter "Name -eq 'foo'"
ls : Cannot call method. The provider does not support the use of filters.
At line:1 char:1 + ls HKLM:\ -Filter "Name -eq 'foo'" +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo          :
NotImplemented: (:) [Get-ChildItem], PSNotSupportedException     +
FullyQualifiedErrorId :
NotSupported,Microsoft.PowerShell.Commands.GetChildItemCommand

عندما يفشل كل شيء آخر، لديك دائمًا معلمتي Include و Exclude أيضًا.

يحتوي هذا الأمر في الباورشيل أيضًا على بعض المعلمات الخاصة بنظام الملفات مثل Force الذي سيخرج الملفات والمجلدات الخفية، File و Directory التي تجد فقط الملفات أو المجلدات. تحقق من الكشف الكامل عن Get-ChildItem من خلال Get-Help أو في وثائق Microsoft.

شيء آخر رائع حول Get-ChildItem هو قدرته على حل المسارات عند استخدام الحرف النجمي. في الباورشيل، يمثل الحرف النجمي عادة أي شيء. على سبيل المثال، إذا كنت ترغب في رؤية جميع الملفات بامتداد .txt، ما عليك سوى تحديد مسار المجلد و *.txt.

PS> Get-ChildItem -Path 'C:\*.txt'

يمكننا أيضًا تصفية حسب سمات الملفات. ربما نريد فقط العثور على الملفات القابلة للقراءة فقط في مجلد.

PS> Get-ChildItem -Path C:\ -Attributes R -File

ملخص

هذا الأمر في PowerShell هو واحد من تلك الأوامر التي ستستخدمها بشكل متكرر. في معظم الأحيان، ستكون على الأرجح تستخدم مزود FileSystem، ولكن من المهم أن تتذكر أن هذا الأمر قادر على القيام بأشياء أكثر من ذلك. استخدمه للاستعلام عن الملفات، والمجلدات، ومفاتيح التسجيل، وقيم التسجيل، والشهادات، ومستخدمي Active Directory، والكمبيوترات، أو حتى المتغيرات البيئية، والوظائف وأكثر من ذلك!

عند الشك، قم بتشغيل الأمر Get-PSDrive لرؤية قائمة بجميع الأقراص في PowerShell المحملة التي يمكن لأمر Get-ChildItem الاستعلام عنها لك.

Source:
https://adamtheautomator.com/get-childitem/