Часть 4: Интерактивная работа: Out-ConsoleGridView, exif, алерты.
В первой части мы определили два ключевых понятия powershell: пайплайн и объект.
Во второй части я рассказал, что такое объекы и пайплайн.
В третьей части познакомились с файловой системой и провайдерами.
Сегодня рассмотрим интерактивную работу с данными в консоли, а также познакомимся с алертами и уведомлениями.
Дисклеймер. На дзен плохое форматирование кода. На github все отформатировено + видео
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 загружает и устанавливает указанный модуль из репозитория в систему. Аналоги: 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
04-1.mp4
Интерфейс:
- Фильтрация: Просто начните вводить текст, и список будет отфильтрован на лету.
- Навигация: Используйте клавиши-стрелки для перемещения по списку.
- Выбор: Нажмите Space для выбора/снятия выделения с одного элемента.
- Множественный выбор: Ctrl+A для выбора всех элементов, Ctrl+D для снятия всего выделения.
- Подтверждение: Нажмите Enter, чтобы вернуть выбранные объекты.
- Отмена: Нажмите ESC, чтобы закрыть окно без возврата данных.
Что умеет Out-ConsoleGridView:
- Отображать табличные данные прямо в консоли в виде интерактивной таблицы с навигацией по строкам и столбцам.
- Сортировать столбцы по нажатию клавиш.
- Фильтровать данные с помощью поиска.
- Выбирать одну или несколько строк с возвратом результата.
- Работать в чистой консоли без GUI-окон.
- Поддерживать большое количество строк с прокруткой.
- Поддерживать различные типы данных (строки, числа, даты и пр.).
Примеры использования Out-ConsoleGridView
1. Базовое использование — показать таблицу с возможностью интерактивного выбора. (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
04-1.mp4
Выводится список процессов в интерактивной консольной таблице. Можно фильтровать по имени, сортировать столбцы и выбирать процессы. Выбранные процессы возвращаются в переменную $selected.
2. Выбор одной строки с обязательным возвратом результата. (radio)
$choice = Get-Service | Select-Object -First 20 | Out-ConsoleGridView -Title "Select a service" -OutputMode Single
Write-Host "You selected service: $($choice.Name)"
04-3.mp4
Пользователь выбирает одну строку (службу). -OutputMode Single запрещает выбирать несколько.
3. Фильтрация и сортировка больших массивов
$data = 1..1000 | ForEach-Object {
[PSCustomObject]@{
Number = $_
Square = $_ * $_
Cube = $_ * $_ * $_
}
}
$data | Out-ConsoleGridView -Title "Numbers and powers" -OutputMode Multiple
Описание: Показывает таблицу из 1000 строк с числами и их степенями.
- Интерактивное управление процессами: Вы можете выбрать несколько процессов для остановки. Параметр -OutputMode Multiple указывает, что мы хотим вернуть все выбранные элементы.# Выбираем процессы в интерактивном режиме
Get-Process | Out-ConsoleGridView -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
} - Выбор одного элемента для детального анализа: Out-ConsoleGridView по умолчанию возвращает один объект (-OutputMode Single), что удобно для выбора одного элемента и его детального изучения.# Выбираем один сетевой адаптер
$adapter = Get-NetAdapter | Out-ConsoleGridView
# Если адаптер был выбран, получаем его полную IP-конфигурацию
if ($adapter) {
Get-NetIPConfiguration -InterfaceIndex $adapter.InterfaceIndex
}
4. Использование с выбором нескольких строк и пост-обработкой
$services = Get-Service | Out-ConsoleGridView -Title "Select services to stop" -PassThru
foreach ($svc in $services) {
Stop-Service -Name $svc.Name -WhatIf
}
Описание: Пользователь выбирает несколько служб из списка, и скрипт имитирует их остановку (-WhatIf).
5. Пример с кастомным заголовком и подсказками
Get-EventLog -LogName System -Newest 50 |
Select-Object TimeGenerated, EntryType, Source, Message |
Out-ConsoleGridView -Title "System Events" -PassThru
Описание: Показ журнала событий Windows в интерактивной таблице с заголовком "System Events".
Варианты реализации алертов в PowerShell.
1. Уведомление в виде всплывающего окна (MessageBox).
Add-Type -AssemblyName PresentationFramework
[System.Windows.MessageBox]::Show("Диск почти заполнен!", "Алерт", "OK", "Warning")
2. Уведомление в трей.
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$notifyIcon = New-Object System.Windows.Forms.NotifyIcon
$notifyIcon.Icon = [System.Drawing.SystemIcons]::Information
$notifyIcon.BalloonTipTitle = "⚠️ Внимание"
$notifyIcon.BalloonTipText = "Процесс завершился с ошибкой"
$notifyIcon.Visible = $true
$notifyIcon.ShowBalloonTip(5000) # 5 секунд
Start-Sleep -Seconds 6
$notifyIcon.Dispose()
Подходит для простых уведомлений на десктопе Windows.
3. 📧 Email-уведомление (SMTP).
Send-MailMessage -To "you@example.com" `
-From "alert@example.com" `
-Subject "Внимание: проблема" `
-Body "Что-то пошло не так" `
-SmtpServer "smtp.example.com"
Поддерживает аутентификацию, SSL, вложения. Можно использовать для системных алертов, особенно с сервера.
4. 📱 Уведомление в Telegram.
$token = "<token>"
$chatId = "<chat_id>"
$text = "⚠️ Внимание: скрипт нашел ошибку"
Invoke-RestMethod -Uri "https://api.telegram.org/bot$token/sendMessage" `
-Method Post -ContentType "application/json" `
-Body (@{ chat_id = $chatId; text = $text } | ConvertTo-Json -Compress)
Подходит для быстрого получения алертов в реальном времени.
5. 💬 Slack / Discord Webhook.
$body = @{
content = "🚨 Ошибка в системе!"
} | ConvertTo-Json
Invoke-RestMethod -Uri "https://discord.com/api/webhooks/..." `
-Method POST -ContentType "application/json" -Body $body
Аналогично работает с Slack, Mattermost и другими чатами.
Статья на github