Головна » як » Geek School Навчання форматування, фільтрації та порівняння в PowerShell

    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 потрібно деякий час. Це все за цей час!