Geek School Навчання форматування, фільтрації та порівняння в PowerShell
У цьому випуску Geek School ми розглядаємо форматування, фільтрацію та порівняння об'єктів у трубопроводі.
Обов'язково прочитайте попередні статті серії:
- Дізнайтеся, як автоматизувати Windows за допомогою PowerShell
- Навчання використанню командлетів у PowerShell
- Навчання використанню об'єктів у PowerShell
І залишайтеся з нами для решти серії цілий тиждень.
Форматування за умовчанням
Коли я вперше почав працювати з PowerShell, я думав, що все було магічно, але правда, це просто потрібно трохи часу, щоб зрозуміти, що відбувається під капотом. Те ж саме стосується системи форматування PowerShell. Насправді, якщо ви запускаєте командлет Get-Service, у створеному виводі відображаються лише 3 властивості: Status, Name і DisplayName.
Але якщо ви отримуєте Get-Service для Get-Member, ви бачите, що об'єкти ServiceController мають набагато більше, ніж просто ці три властивості, так що відбувається?
Відповідь лежить у прихованому файлі, який визначає, як більшість вбудованих командлетів відображатиме їхній вивід. Щоб зрозуміти, введіть наступне в оболонку і натисніть Enter.
Блокнот C: Windows System32 WindowsPowerShell v1.0 DotNetTypes.format.ps1xml
Якщо ми використовуємо функцію "Блокнот" Find, ми можемо швидко перейти до розділу, в якому деталізується вихід командлета Get-Service шляхом пошуку типу ServiceController.
Раптом, ви можете побачити, що під капотом PowerShell форматування будь-яких об'єктів у трубопроводі, які мають тип ServiceController і створення таблиці з трьома стовпцями: Status, Name і DisplayName. Але що, якщо тип, з яким ви маєте справу, не має запису в цьому файлі, або будь-якого іншого файлу формату для цього? Добре тоді, це є повністю звичайне фактично. Якщо об'єкт, що виходить з конвеєра, має 5 або більше властивостей, PowerShell відображає всі властивості об'єкта у списку; якщо він має менше 5 властивостей, він відображає їх у таблиці.
Форматування даних
Якщо ви не задоволені форматуванням об'єкта або типу за умовчанням, ви можете копіювати власне форматування. Для цього потрібно знати три командлета.
- Формат-список
- Формат-таблиця
- Широкоформатний формат
Широкоформатний формат просто бере колекцію об'єктів і відображає одну властивість кожного об'єкта. За замовчуванням вона шукатиме властивість імені; якщо ваші об'єкти не містять властивості name, воно буде використовувати першу властивість об'єкта після сортування властивостей в алфавітному порядку.
Get-Service | Широкоформатний формат
Як ви бачите, він також за умовчанням має два стовпці, хоча ви можете вказати як властивість, яку ви хочете використовувати, так і скільки стовпців потрібно відображати.
Get-Service | Format-Wide -Property DisplayName-Column 6
Якщо щось відформатовано як таблицю за промовчанням, ви завжди можете перемкнути її на перегляд списку за допомогою командлета Format-List. Давайте подивимося на вихід командлета Get-Process.
Цей табличний вигляд дуже добре підходить для такого роду інформації, але давайте прикидаємо, що хочемо переглянути його у вигляді списку. Все, що ми дійсно повинні зробити, це трубку Формат-список.
Get-Process | Формат-список
Як ви бачите, у списку за замовчуванням відображаються лише чотири елементи. Щоб переглянути всі властивості об'єкта, можна скористатися символом підстановки.
Get-Process | Список-Формат-Власність *
Також можна вибрати потрібні властивості.
Get-Process | Формат-список -ім'я властивості, id
Формат-таблиця, з іншого боку, приймає дані і перетворює їх у таблицю. Оскільки наші дані з Get-Process вже знаходяться у формі таблиці, ми можемо використовувати її для легкого вибору властивостей, які ми хочемо відобразити в таблиці. Я використав параметр AutoSize, щоб всі дані містилися на одному екрані.
Get-Process | Ім'я формату-таблиці, ідентифікатор -AutoSize
Фільтрація та порівняння
Одна з найкращих речей щодо використання об'єктного конвеєра полягає в тому, що ви можете фільтрувати об'єкти з конвеєра на будь-якому етапі за допомогою командлета Where-Object.
Get-Service | Де-об'єкт $ _. Статус -eq "Запуск"
Використання об'єкта в дійсності дуже просте. $ _ представляє поточний об'єкт конвеєра, з якого ви можете обрати властивість, на яку ви хочете фільтрувати. Тут лише зберігаються об'єкти, у яких властивість Status дорівнює Running. У блоці сценаріїв фільтрації можна використовувати декілька операторів порівняння:
- eq (рівно до)
- neq (не рівний)
- gt (Більше)
- ge (більший чи рівний)
- lt (менше, ніж)
- le (менше або рівне до)
- like (відповідність рядків підстановки)
Повний список та більше інформації можна переглянути в концептуальному довідковому файлі about_comparison, однак для звикання до синтаксису Where-Obeject потрібно деякий час. Це все за цей час!