Особливості використання командлет Get-ChildItem.
Командлети Get-ChildItem призначений для отримання списку папок і файлів, що знаходяться на диску. Він має безліч алиасов (gci, dir, ls) і є одним з найбільш популярних командлетів для роботи з файловою системою. Get-ChildItem досить простий в застосуванні, але має деякі особливості, знання яких може допомогти більш ефективно його використовувати.
Для тестування візьмемо папку C: \ Files, накидати в неї сміття різних файлів і папок і перевіримо на ній роботу командлет з різними параметрами.
Шлях
Суть роботи командлет Get-ChildItem полягає в тому, що він бере заданий об'єкт (диск або директорію) і виводить список його дочірніх елементів.Шлях до потрібного об'єкту вказується за допомогою параметра -Path. Наприклад, для перегляду вмісту папки C: \ Files треба виконати команду:
Get-ChildItem -Path "C: \ Files"
Сама назва параметра вказувати не обов'язково, можна вказати тільки його значення:
Get-ChildItem "C: \ Files"
А якщо перейти в потрібну папку, то шлях можна взагалі не вказувати.Як шлях за замовчуванням використовується поточна директорія, тому для отримання списку об'єктів досить виконати команду:
Get-ChildItem
Шлях може бути як абсолютним, так і відносним. Наприклад переглянути вміст папки Books, що знаходиться всередині C: \ Files, можна такою командою:
Get-ChildItem -Path "C: \ Files \ Books"
а можна такий:
Get-ChildItem -Path "Books"
В параметрі -Path допускається використання групових символів (wildcards), що дозволяє фільтрувати потрібні результати.Так наступна команда виводить всі файли з розширенням .txt, що знаходяться в поточній директорії:
Get-ChildItem -Path "* .txt"
А так ми отримаємо всі файли і папки, що мають у назві слово Book:
Get-ChildItem -Path "Book *"
За допомогою підстановки можна реалізувати і більш складні фільтри.Для прикладу виведемо вміст всіх папок в поточній директорії, що мають в своєму імені слово Book:
Get-ChildItem -Path "Book * \ *"
і ще ускладнити завдання і запитаємо файли з розширенням .pdf з підпапок, які перебувають в папках, що мають в своєму імені слово Book:
Get -ChildItem -Path "Book * \ * \ *.pdf "
Крім -Path командлет Get-ChildItem має параметр -LiteralPath, за допомогою якого також можна вказувати шлях. Це параметр відрізняється від -Path тим, що при його використанні всі службові символи інтерпретуються як звичайні, тобто символи підстановки використовувати не можна.Наприклад при використанні -LiteralPath така команда відпрацює коректно:
Get-ChildItem -LiteralPath "Books"
а така викличе помилку:
Get-ChildItem -LiteralPath " Book * "
Імена
За замовчуванням командлет Get-ChildItem виводить дані в наступному форматі - ім'я об'єкта , розмір (для файлів), дата і час останньої зміни і список атрибутів.Якщо весь цей набір не потрібен, то можна задіяти спеціальний параметр -Name, який повертає тільки імена знайдених об'єктів. Наприклад так виведемо імена всіх файлів і папок, що знаходяться в папці Books:
Get-ChildItem -Path "Books" -Name
Параметр -Name може приймати певне значення і дозволяє використання групових символів .Трохи модифікуємо попередню команду і виведемо тільки імена об'єктів, що знаходяться в папці Books і мають в своєму імені слово Bible:
Get-ChildItem -Path "Books" -Name "* Bible *"
Рекурсія
За замовчуванням Get-ChildItem виводить тільки об'єкти, що знаходяться в корені вказаній директорії.Для перегляду вмісту всіх дочірніх елементів необхідно використовувати командлет з параметром -Recurse. Наприклад, вивести вміст папки Books, включаючи вміст всіх, хто знаходиться в ній підпапок, можна командою:
Get-ChildItem -Path "Books" -Recurse
Порівняйте з висновком команди без -Recurse і відчуйте різницю.
При використанні рекурсії командлет здійснює пошук по всіх вкладених тек, незалежно від глибини вкладення. Обмежити рівень вкладення можна за допомогою параметра -Depth, що з'явився в PowerShell 5.0. Для прикладу виведемо вміст папки Books і всіх вкладених підпапок до другого рівня вкладення:
Get-ChildItem -Path "Books" -Recurse -Depth 2
Атрибути
Кожен об'єкт файлової системи може мати один або кілька атрибутів.Атрибути використовуються для визначення типу об'єкта (файл або директорія) та інших його особливостей (прихований, системний, архівний тощо.).
Для роботи з атрибутами у командлет Get-ChildItem є кілька різних способів. Так якщо нам потрібно вивести тільки директорії з нашої папки C: \ Files, то можна скористатися параметром -Directory:
Get-ChildItem -Directory
Обмежити висновок тільки файлами можна отримати за допомогою параметра -File:
Get-ChildItem -File
А для вибору прихованих і системних об'єктів служать відповідно параметри -Hidden і -System.Ці параметри можна використовувати спільно, наприклад отримати всі приховані і системні файли можна командою:
Get-ChildItem -File -Hidden -System
Також для вказівки атрибутів можна використовувати параметр -Attributes. Підтримуються наступні атрибути:
• Archive
• Compressed
• Device
• Directory
• Encrypted
• Hidden
• Normal
• NotContentIndexed
• Offline
• ReadOnly
• ReparsePoint
• SparseFile
• System
• Temporary
Примітка.Повний список і докладний опис атрибутів файлової системи можна знайти тут https://msdn.microsoft.com/en-us/library/system.io.fileattributes(lightweight).aspx
Например для виведення тільки директорій підійде така команда:
Get-ChildItem -Attributes Directory
а для показу прихованих об'єктів така:
Get-ChildItem -Attributes Hidden
для найбільш популярних атрибутів є скорочення:
D - (Directory)
H - (Hidden)
R - (Read-only)
S - (System)
При вказівці декількох атрибутів можна використовувати логічні оператори:
• Кома - оператор АБО (OR)
• Плюс - оператор І (AND)
• знак оклику - оператор НЕ (NOT)
Для прикладу візьмемо три атрибути - D (директорія), H (прихований) і S (системний).Наступна команда видасть всі об'єкти, що мають хоча б один з перерахованих атрибутів:
Get-ChildItem -Attributes D, H, S
Якщо потрібно вивести об'єкти, що мають в наявності всі три атрибути (приховані системні директорії) можна скористатися такою командою:
Get-ChildItem -Attributes D + H + S
А тепер трохи модифікуємо попередню команду за допомогою оператора НЕ і отримаємо тільки приховані і системні файли :
Get-ChildItem -Attributes! D + H + S
Тут атрибут! D значить не директорія, відповідно команда виводить всі об'єкти крім директорій, т.е. тільки файли.
І ще один параметр, який має якесь відношення до атрибутів. За замовчуванням Get-ChildItem не вказує файли і папки, які мають атрибути прихований і системний. Тому, якщо потрібно показати все без винятку, необхідно використовувати командлет з параметром -Force:
Get-ChildItem -Force
Фільтри
Завдання Get-ChildItem полягає в тому, щоб вивести тільки потрібні об'єкти і відфільтрувати непотрібні.Для фільтрації результатів у нього є три спеціальних параметра.
Параметр -Filter призначений для фільтрації виведених результатів і в якості значення може приймати ім'я елемента, також допускається використання групових символів. Для прикладу виведемо список всіх об'єктів, що знаходяться в папці C: \ Files і мають в своєму імені слово book:
Get-ChildItem -Path "C: \ Files" -Filter "* book *" -Recurse
А так отримаємо всі файли з розширенням.docx:
Get-ChildItem -Path "C: \ Files" -Filter "* .docx" -Recurse
Варто зауважити, що отримати потрібний результат можна різними способами. Наприклад наступна команда видасть такий же результат, що і попередня:
Get-ChildItem -Path "C: \ Files \ *. Docx" -Recurse
Примітка. У PowerShell 2.0 (і більш ранніх версій) рекурсія працює тільки в тому випадку, якщо шлях вказує на об'єкт, що має дочірні елементи (напр.C: \ Files), і не працює, якщо в шляху вказано об'єкт без дочірніх елементів (напр. C: \ Files \ *. Docx). Тобто команда, наведена вище, працює тільки в PowerShell 3.0 і вище.
Способи фільтрації можна поєднувати. Наприклад так отримаємо всі файли з розширенням .docx, що мають в своєму імені слово book:
Get-ChildItem -Path "C: \ Files \ *.docx "-Filter" * book * "-Recurse
Також як і -Filter, парметри -Include і -Exclude призначені для фільтрації виведення і розуміють символи підстановки. Але між ними є одна фундаментальна відмінність: при використанні -Filter результати фільтруються безпосередньо в процесі отримання даних (папок і файлів), а -Include і -Exclude застосовуються вже після того, як всі дані отримані.Відповідно в однаковій ситуації команда з використанням -Filter відпрацює швидше і ефективніше. Втім, помітити різницю вийде тільки при достатньо великому обсязі даних.
Параметр -Include призначений для виведення тільки зазначених у ньому елементів. Однак у нього є одна "цікава" особливість, про яку потрібно знати - як значення параметра повинні бути вказані всі елементи, включаючи директорію, в якій проводиться пошук.Для прикладу спробуємо вивести всі файли з розширенням .pdf, що знаходяться в папці C: \ Files \ Books:
Get-ChildItem -Path "C: \ Files \ Books" -Include "* .pdf"
Як бачите, команда не дає ніякого результату, хоча потрібні файли там є. Для отримання результату команду необхідно змінити, наприклад так:
Get-ChildItem -Path "C: \ Files \ Books \ *" -Include "*.pdf "
або так:
Get-ChildItem -Path" C: \ Files \ Books "-Include" books "," *. pdf "
Також в даній ситуації може допомогти використання рекурсії:
Get-ChildItem -Path "C: \ Files \ Books "-Include" * .pdf "-Recurse
Одним з переваг -Enclude (і -Exclude) є те, що на відміну від -Filter вони можуть приймати множинні значення.Наприклад, вивести всі архівні файли з C: \ Files можна такою командою:
Get-ChildItem -Path "C: \ Files" -Include "* .zip", "*. Rar", "* .7z "-Recurse
Параметр -Exclude має дію, зворотне -Include, тобто . виключає зазначені елементи з виведених даних. Наприклад так отримаємо всі об'єкти в поточній директорії крім файлів і папок, що мають у своїй назві слово IIS:
Get-ChildItem -Path "C: \ Files" -Exclude "* IIS *"
а так виведемо всі файли з C: \ Files \ Books, крім PDF-файлів:
Get-ChildItem -Path "C: \ Files \ Books" -Exclude "*.pdf "-File -Recurse
Як я вже говорив, способи фільтрації можна комбінувати. Наприклад виведемо всі виконувані файли, що знаходяться в C: \ Files, включаючи приховані і системні:
Get-ChildItem -Path "C: \ Files \ Books \ *. Exe" -Force
А потім відкинемо результати, у яких в імені є IIS:
Get-ChildItem -Path "C: \ Files \ Books \ *.exe "-Force -Exclude" * IIS * "
Ще варіант - візьмемо всі об'єкти з ім'ям IIS:
Get-ChildItem -Include "* IIS *" -Recurse
і викинемо з результату виконувані файли:
Get-ChildItem -Include "* IIS * "-Exclude" * .exe "-Recurse
Ну і наостанок запитаємо всі файли з розширенням .pdf, що мають у назві слово Windows без слова Server:
Get-ChildItem -Path "C: \ Files \ *.pdf "-Filter" * windows * "-Exclude" * server * "-Recurse
як бачите, Get-ChildItem дозволяє дуже гнучко управляти видаються результатами, і навіть без використання регулярних виразів.
.