Сервісний центр VPSGroup ремонт комп'ютерної техніки, заправка картриджів, ремонт оргтехніки, Київ, Виставковий центр, Васильківська, 55

Особливості використання командлет 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 дозволяє дуже гнучко управляти видаються результатами, і навіть без використання регулярних виразів.

.