Get-ChildItem: רשימת קבצים ותיקיות עם PowerShell

זכור את ימי ה-DOS הטובים עם פקודת dir? ומה עם פקודת ה-Linux ls? אם כן, אז Get-ChildItem היא בעצם אותו דבר, אבל קצת מתקדמת יותר.

למעשה, יש לנו אף את dir ו-ls ב-PowerShell בצורת כינוי. פקודת ה-cmdlet של PowerShell, Get-ChildItem, יכולה לרשום לא רק קבצים ותיקיות במערכת קבצים דרך קונסולת ה-PowerShell או סקריפט PowerShell, אלא גם לרשום מפתחות רישום וערכים, תעודות בכמה חנויות תעודות שונות ואף ב-Active Directory, לדוגמה.

אם אתה מתחיל או בינוני בתכנות ב-PowerShell, הקפיצה לקורס המיני החינמי שלי על בניית כלי PowerShell היא חובה! מעל 9,000 מילים של הסבר עמוק ותובנות על איך לבנות כלי PowerShell.

כדי להבין את Get-ChildItem, תחשוב על זה בהקשר של dir ו-ls, אך במקום לראות רק קבצים, הוא עושה זאת עם אובייקטים רבים כילדים ומספר אותם. ניתן להשתמש בכינוי או בשם הפקודה המלא כדי להשתמש בזה.

מאחר ופקודה זו זמינה מגרסה 1 של PowerShell, תוכל להיות בטוח שהיא תעבוד עם גרסת 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

מיקרוסופט הבינו שניווט במבנה כמו "עץ" של מערכת קבצים ניתן ליישם גם במערכות אחרות. מערכת קבצים "עץ" מכילה תיקיות וקבצים, אך רישום מכיל מפתחות וערכים, בעוד שמערכת האישורים בווינדוס מכילה חנויות ואישורים בתוך חנויות אלו. כל אחת מאזורים אלו יכולה להיות מיוצגת כעץ ולכן נוצר ספק פוורשל. למה כל הדיבור הזה על ספקי פוורשל? מכיוון שפקודת ה-Get-ChilldItem היא חלק מפקודות ה-*-Item שמתמידות עם מנועי פוורשל שכל ספק חושף.

פקודת ה-Get-ChildItem יכולה להוציא כל מספר של אובייקטים במנוע פוורשל ומאפשרת לך לעבד כל פריט דרך הצינור או אולי בלולאת foreach בפוורשל. היא מבינה את המושג של מנוע פוורשל שמאפשר לך לציין Path של תיקיית מערכת קבצים, מפתח רישום או חנות אישורים כל באחת.

ניתן לראות למטה כי הפקודה הזו יכולה לספור את תיקיית ה-C:\, מערך HKEY Current User וגם את חנות אישורי הפוורשל.

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 ב-PowerShell לא יכולה רק למשוך את כל האובייקטים במערכת הגיבוי אלא שיכולה גם לסנן את המידע דרך מספר פרמטרים שונים: Filter, Include ו־Exclude. תמיד כדאי להשתמש בפרמטר הנפוץ של PowerShell, 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.

הפקודה ב-PowerShell מכילה גם כמה פרמטרים הקשורים למערכת הקבצים, כמו Force המציג גם קבצים ותיקיות מוסתרים, ו־File ו־Directory שמוצאים רק קבצים או תיקיות. ניתן למצוא את כל הפרטים בפקודה Get-ChildItem באמצעות Get-Help או ב-מסמכי Microsoft.

דבר נוסף מעניין על Get-ChildItem הוא יכולתו לפתור נתיבים בשימוש בתו הכללי. ב-PowerShell, תו הכללי מייצג בדרך כלל כל דבר. לדוגמה, אם ברצונך לראות את כל הקבצים עם סיומת .txt, פשוט ציין את הנתיב לתיקייה ואת *.txt.

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

אנו יכולים גם לסנן לפי מאפייני קובץ. אולי נרצה למצוא רק את הקבצים שנקראים בלבד בתיקייה כלשהי.

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

סיכום

פקודת ה-PowerShell הזו היא אחת מהפקודות שתשתמש בהן מחדש. ברוב הזמן, כנראה תשתמש בספק המערכת הקובץ, אך חשוב לזכור שהפקודה הזו מסוגלת לעשות הרבה יותר. ניתן להשתמש בה לשאילתת קבצים, תיקיות, מפתחות רישום, ערכי רישום, תעודות, משתמשים ב-Active Directory, מחשבים או אפילו משתני סביבה, פונקציות ועוד!

כשיש ספקולציה, הפעל את הפקודה Get-PSDrive כדי לראות רשימה של כל הכוננים שטענת הפקודה Get-ChildItem יכולה לשאול עבורך.

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