Перейти к содержимому
davidka.net > 💻 🧠 Код 1001 > ⚡ Философия PowerShell > Философия PowerShell. Часть 4: Интерактивная работа: Out-ConsoleGridView, алерты.

Философия PowerShell. Часть 4: Интерактивная работа: Out-ConsoleGridView, алерты.

  • автор:

В первой части мы определили два ключевых понятия powershell: пайплайн и объект.

  • Во второй части я рассказал, что такое объекы и пайплайн.
  • В третьей части познакомились с файловой системой и провайдерами.
  • Сегодня рассмотрим интерактивную работу с данными в консоли, а также познакомимся с алертами и уведомлениями.

Интерактивная работа с данными в консоли.

Out-ConsoleGridView. GUI в консоли PowerShell.

❗ Важно: Все описываемые ниже инструменты требуют PowerShell 7.2 или новее.

Out-ConsoleGridView — это интерактивная таблица, прямо в консоли PowerShell, позволяющая:
— просматривать данные в виде таблицы;
— фильтровать и сортировать колонки;
— выбирать строки курсором — для передачи их дальше по пайплайну.
— и многое другое.

Out-ConsoleGridView является частью модуля Microsoft.PowerShell.ConsoleGuiTools.
Для его использования сначала нужно установить этот модуль.

Для установки модуля выполните следующую команду в PowerShell:

Install-Module Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser
Install-Module Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser

Install-Module загружает и устанавливает указанный модуль из репозитория в систему.
Аналоги: pip install в Python или npm install в Node.js.

📎 Ключевые параметры Install-Module

ПараметрОписание
-NameИмя модуля, который нужно установить.
-ScopeОбласть установки: AllUsers (по умолчанию, требует прав администратора) или CurrentUser (не требует прав администратора).
-RepositoryУказывает репозиторий, например PSGallery.
-ForceПринудительная установка без подтверждения.
-AllowClobberРазрешает перезаписать уже существующие команды.
-AcceptLicenseАвтоматически принимает лицензию модуля.
-RequiredVersionУстанавливает конкретную версию модуля.

После установки вы можете передавать любой вывод в Out-ConsoleGridView для интерактивной работы.

# Классический пример: вывод списка процессов в интерактивную таблицу
Get-Process | Out-ConsoleGridView

1

Интерфейс:

  • Фильтрация: Просто начните вводить текст, и список будет отфильтрован на лету.
  • Навигация: Используйте клавиши-стрелки для перемещения по списку.
  • Выбор: Нажмите Space для выбора/снятия выделения с одного элемента.
  • Множественный выбор: Ctrl+A для выбора всех элементов, Ctrl+D для снятия всего выделения.
  • Подтверждение: Нажмите Enter, чтобы вернуть выбранные объекты.
  • Отмена: Нажмите ESC, чтобы закрыть окно без возврата данных.

Что умеет Out-ConsoleGridView:

  • Отображать табличные данные прямо в консоли в виде интерактивной таблицы с навигацией по строкам и столбцам.
  • Сортировать столбцы по нажатию клавиш.
  • Фильтровать данные с помощью поиска.
  • Выбирать одну или несколько строк с возвратом результата.
  • Работать в чистой консоли без GUI-окон.
  • Поддерживать большое количество строк с прокруткой.
  • Поддерживать различные типы данных (строки, числа, даты и пр.).

Примеры использования Out-ConsoleGridView

Базовое использование — показать таблицу с возможностью интерактивного выбора. (checkbox)

Import-Module Microsoft.PowerShell.ConsoleGuiTools

$data = Get-Process | Select-Object -First 30 -Property Id, ProcessName, CPU, WorkingSet

# Вывести таблицу с возможностью фильтрации, сортировки и выбора строк
$selected = $data | Out-ConsoleGridView -Title "Select process(es)" -OutputMode Multiple

$selected | Format-Table -AutoSize

2

Выводится список процессов в интерактивной консольной таблице.
Можно фильтровать по имени, сортировать столбцы и выбирать процессы.
Выбранные процессы возвращаются в переменную $selected.


Выбор одной строки с обязательным возвратом результата. (radio)

$choice = Get-Service | Select-Object -First 20 | Out-ConsoleGridView -Title "Select a service" -OutputMode Single

Write-Host "You selected service: $($choice.Name)"

Пользователь выбирает одну строку (службу). -OutputMode Single запрещает выбирать несколько.


Фильтрация и сортировка больших массивов

$data = 1..1000 | ForEach-Object {
    [PSCustomObject]@{
        Number = $_
        Square = $_ * $_
        Cube   = $_ * $_ * $_
    }
}

$data | Out-ConsoleGridView -Title "Numbers and powers"  -OutputMode Multiple

Показывает таблицу из 1000 строк с числами и их степенями.

**Интерактивное управление процессами:**

Вы можете выбрать несколько процессов для остановки. Параметр -OutputMode Multiple указывает, что мы хотим вернуть все выбранные элементы.

# Передаём результаты по конвейеру.
# Останавливаем выбранные процессы с параметром -WhatIf для предварительного просмотра.
# Для этого определим переменную $procsToStop
$procsToStop = Get-Process | Out-ConsoleGridView -OutputMode Multiple

# Если что-то было выбрано, передаем объекты дальше по конвейеру
if ($procsToStop) {
    $procsToStop | Stop-Process -WhatIf
}

**Выбор файлов для архивации:**

Найдем все .log файлы в папке, выберем нужные и создадим из них архив.

$filesToArchive = Get-ChildItem -Path C:\Logs -Filter "*.log" -Recurse | Out-ConsoleGridView -OutputMode Multiple

❗Будьте осторожны с рекурсией

if ($filesToArchive) {
    Compress-Archive -Path $filesToArchive.FullName -DestinationPath C:\Temp\LogArchive.zip

    # Добавляем сообщение об успехе
    Write-Host "✅ Архивация успешно завершена!" -ForegroundColor Green
}

**Выбор одного элемента для детального анализа:**

Паттерн «Drill-Down» — от общего списка к деталям с Out-ConsoleGridView

Часто при работе с системными объектами мы сталкиваемся с дилеммой:

  1. Если запросить все свойства для всех объектов (Get-NetAdapter | Format-List *), вывод будет огромным и нечитаемым.
  2. Если показать краткую таблицу, мы потеряем важные детали.
  3. Иногда попытка получить все данные сразу может привести к ошибке, если один из объектов содержит некорректные значения.

Решение этой проблемы — паттерн «Drill-Down» (детализация или «проваливание вглубь»). Его суть проста:

  • Шаг 1 (Обзор): Показать пользователю чистый, краткий и безопасный список элементов для выбора.
  • Шаг 2 (Детализация): После того как пользователь выбрал один конкретный элемент, показать ему всю доступную информацию именно по этому элементу.

Практический пример: Создание обозревателя сетевых адаптеров

Реализуем этот паттерн на примере команды Get-NetAdapter.

Задача: Сначала показать краткий список сетевых адаптеров. После выбора одного из них, открыть второе окно со всеми его свойствами.

Готовый код:

# --- Этап 1: Выбор адаптера из краткого списка ---
$adapterList = Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeed
$selectedAdapter = $adapterList | Out-ConsoleGridView -Title "ЭТАП 1: Выберите сетевой адаптер"

# --- Этап 2: Показ детальной информации или сообщения об отмене ---
if ($null -ne $selectedAdapter) {
    # Получаем ВСЕ свойства для ВЫБРАННОГО адаптера
    $detailedInfoObject = Get-NetAdapter -Name $selectedAdapter.Name | Select-Object *

    # Используем наш трюк с .psobject.Properties, чтобы превратить объект в удобную таблицу "Имя-Значение"
    $detailedInfoForGrid = $detailedInfoObject.psobject.Properties | Select-Object Name, Value

    # Открываем ВТОРОЕ окно GridView с полной информацией
    $detailedInfoForGrid | Out-ConsoleGridView -Title "ЭТАП 2: Полная информация по '$($selectedAdapter.Name)'"
} else {
    Write-Host "Операция отменена. Адаптер не был выбран." -ForegroundColor Yellow
}

Пошаговый разбор

  1. Создание «безопасного» списка:
    $adapterList = Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeed
    Мы не передаем вывод Get-NetAdapter напрямую. Вместо этого мы создаем новые, «чистые» объекты с помощью Select-Object, включая только те свойства, которые нам нужны для обзора. Это гарантирует, что проблемные данные, вызвавшие ошибку, будут отброшены.
  2. Первое интерактивное окно:
    $selectedAdapter = $adapterList | Out-ConsoleGridView ...
    Скрипт показывает первое окно и останавливает свое выполнение, ожидая вашего выбора. Как только вы выберете строку и нажмете Enter, объект, соответствующий этой строке, будет записан в переменную $selectedAdapter.
  3. Проверка выбора:
    if ($null -ne $selectedAdapter)
    Это критически важная проверка. Если пользователь нажмет Esc или закроет окно, переменная $selectedAdapter будет пустой ($null). Эта проверка предотвращает выполнение остального кода и возникновение ошибок.
  4. Получение полной информации:
    $detailedInfoObject = Get-NetAdapter -Name $selectedAdapter.Name
    Вот ключевой момент паттерна. Мы снова обращаемся к Get-NetAdapter, но на этот раз запрашиваем только один объект по его имени, которое мы взяли из выбранного на первом этапе элемента. Теперь мы получаем полный объект со всеми его свойствами.
  5. Преобразование для второго окна:
    $detailedInfoForGrid = $detailedInfoObject.psobject.Properties | ...
    Мы используем уже знакомый вам мощный прием, чтобы «развернуть» этот один сложный объект в длинный список пар «Имя свойства» | «Значение», который идеально подходит для отображения в таблице.
  6. Второе интерактивное окно:
    $detailedInfoForGrid | Out-ConsoleGridView ...
    На экране появляется второе окно, на этот раз с исчерпывающей информацией по тому самому адаптеру, который вы выбрали.

Пример с кастомным заголовком и подсказками

Показ журнала событий Windows в интерактивной таблице с заголовком «System Events».

Get-EventLog -LogName System -Newest 50 |
    Select-Object TimeGenerated, EntryType, Source, Message |
    Out-ConsoleGridView -Title "System Events"  -OutputMode Multiple

Этот код получает 50 последних событий из системного журнала Windows, отбирает у каждого события только четыре ключевых свойства
(время, тип, источник и сообщение) и отображает их в окне Out-ConsoleGridView .


Информация о системе.

1

код скрипта для получения информации о системе:
Get-SystemMonitor.ps1

Создание командлета ‘Get-SystemMonitor’

Шаг 1: Настройка переменной PATH

  1. Создайте постоянную папку для ваших инструментов, если еще не сделали этого. Например:
    C:\PowerShell\Scripts
  2. Поместите ваш файл Get-SystemMonitor.ps1 в эту папку.
  3. Добавьте эту папку в системную переменную PATH,

Шаг 2: Настройка псевдонима в профиле PowerShell

Теперь, когда система знает, где найти ваш скрипт по его полному имени, мы можем создать для него короткий псевдоним.

  1. Откройте ваш файл профиля PowerShell:
    notepad $PROFILE
  2. Добавьте в него следующую строку:
    # Псевдоним для системного монитора Set-Alias -Name sysmon -Value "Get-SystemMonitor.ps1" Обратите внимание на ключевой момент: Поскольку папка со скриптом уже находится в PATH, нам больше не нужно указывать полный путь к файлу! Мы просто ссылаемся на его имя. Это делает ваш профиль более чистым и надежным. Если вы когда-нибудь переместите папку C:\PowerShell\Scripts, вам нужно будет обновить только переменную PATH, а ваш файл профиля останется без изменений.

Перезапустите PowerShell

Закройте все открытые окна PowerShell и откройте новое. Это необходимо, чтобы система применила изменения как в переменной PATH, так и в вашем профиле.


Итог: Что вы получаете

После выполнения этих шагов вы сможете вызывать ваш скрипт двумя способами из любого места в системе:

  1. По полному имени (надежно, для использования в других скриптах): Get-SystemMonitor.ps1 Get-SystemMonitor.ps1 -Resource storage
  2. По короткому псевдониму (удобно, для интерактивной работы): sysmon sysmon -Resource memory

Вы успешно «прописали» свой скрипт в системе самым профессиональным и гибким способом.

Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀

Другие статьи о PowerShell:

Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *