Использование командлета Out-Gridview для выбора в табличных данных в скриптах PowerShell
Командлет Out-GridView позволяет вывести данные в виде интерактивной графической таблицы с возможностью фильтрации и сортировки по различным признакам. Вы можете использовать командлет Out-Gridview в скриптах, где нужно предоставить простейший GUI интерфейс для выбора объектов пользователю.
Out-GridView по сути является оболочкой для запуска стандартной графической формы .NET DataGridView из Windows Form Control.
Рассмотрим простейший пример использования командлета для вывода списка служб Windows и некоторых их свойств:
Get-Service | Select DisplayName,Status,ServiceName,Can* | Out-GridView
Как вы видите перед вами открылась графическая форма с таблицей, представляющей список свойств служб Windows. Командлет автоматически именует столбцы на основе свойства объекта и типа данных, расширяет свойства PSObject, если определение формата недоступно.
Прямо из этой формы вы можете выполнять поиск либо с помощью поля для ввода Filter:
Либо с помощью кнопки Add criteria. На следующем скриншоте я создал простейший фильтр со списком запущенных служб, в имени которых есть символы VMW. Фильтр создается прямо по значениям свойств объектов.
Или, например, выведем список ТОП 10 процессов, которые сильнее всего используют CPU (с помощью параметра –Title я изменил заголовок окна Out-GridView):
Get-Process | Sort-Object CPU -Descending | Select -First 10 | Out-GridView -Title "Top 10 CPU processes"
Можно быстро отсортировать содержимое таблицы по убыванию/возрастанию, щелкнув по названию столбца.
Однако наиболее мощной возможностью Out-Gridview, которая предоставляет новый уровень удобного графического интерфейса для ваших PowerShell скриптов, является параметр –PassThru.
Данный параметр доступен начиная с версии PowerShell 3.0 и позволяет пользователю выбрать в таблице одну или несколько объектов и передать их по конвейеру через стандартный пайп на вход следующим командлетам в скрипте PowerShell.
Например, следующий PowerShell скрипт выведет в таблицу список запущенных служб Windows. Пользователь должен выбрать в таблице нужную службу и нажать Ok.
Get-Service | Where-Object {$_.status -eq 'running'}| Out-GridView -Title "Select service to restart" –PassThru -OutputMode Multiple | Restart-service –verbose
Скрипт перезапустит только выбранную пользователем службу.
Вы можете сохранить объекты, выбранный пользователем в переменную:
$Svcs = Get-Service | Where-Object {$_.status -eq 'running'}| Out-GridView -Title "Select services" –PassThru
Или можно сохранить только значения определенного свойства. Для этого добавьте к предыдущей команде:
| Select -ExpandProperty Name
Вы можете разрешить пользователю выбирать только один элемент в таблице или сразу несколько с помощью параметров:
-OutputMode Single
и
-OutputMode Multiple
Зажмите ctrl, чтобы выделить несколько разных строк в таблице.
Еще несколько интересных сценариев использования командлета Out-GridView.
Вывести список предыдущих команд из истории PowerShell и повторно выполнить выбранные команды:
Get-History | Out-GridView -PassThru | Invoke-Expression
Вывести список дополнительных компонентов Windows и установить выделенные компоненты (например инструменты управления Active Directory из RSAT и SSH клиент):
Get-WindowsCapability -Online | Where-Object {$_.State –eq “NotPresent”}| Out-GridView -PassThru |Add-WindowsCapability –Online
Получить список RDP сессии с Connection Broker в RDS ферме и подключиться к выбранному пользователю с помощью теневого подключения:
import-module remotedesktop
$cbserver = "srv-rdsbroker1.winitpro.ru"
$id = get-rdusersession -ConnectionBroker $cbserver | Out-GridView -title "RD Connection" -PassThru | select hostserver, unifiedsessionid
$id2 = $id | select -ExpandProperty unifiedsessionid
$srv = $id | select -ExpandProperty hostserver
mstsc /v:"$srv" /shadow:"$id2" /control /noconsentprompt
С помощью командлета Get-ADUser из модуля AD PowerShell можно вывести список включенных пользователей в определенном OU и сбросить пароль в домене.
Import-Module ActiveDirectory
$NewPasswd=Read-Host "Введите новый пароль пользователя" –AsSecureString
Get-ADUser -filter {Enabled -eq "true"} -properties Name, displayname,EmailAddress,pwdLastSet -SearchBase ‘OU=ru,DC=test,DC=com’| Out-GridView -PassThru –title “Выберите пользователя чтобы сбросить пароль”| Set-ADAccountPassword -NewPassword $NewPasswd -Reset
Через Invoke-Command можно получить данные с удаленных компьютеров и представить их в таблице:
Invoke-Command -ComputerName msk-dc01, msk-dc02, msk-dc03 -ScriptBlock {Get-Culture} | Select-Object PSComputerName,DisplayName| Out-GridView
out-gridview : To use the Out-GridView, install Windows PowerShell ISE by using Server Manager, and then restart this application. (Could not load file or assembly 'Microsoft.PowerShell.GraphicalHost, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.)
Но вы можете использовать для обращения к Server Core параметр –ComputerName, который есть у большинства командлетов. Например:
Get-Service -ComputerName msk-dc02 | Where-Object {$_.status -eq 'running'}| Out-GridView –Title "Select service to restart" -OutputMode Single|Restart-Service -Verbose
Microsoft по какой-то причине убрала командлет Out-GridView из PowerShell Core 6.x, но в 7.0 версии его вернули. Если у вас используется версиях PowerShell 6.x, обновите ее до последние командой:
iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"
Как вы видите, Out-GridView позволяет добавить удобный графический интерфейс вашим скриптам PowerShell
Windows 10
Использование командлета Out-Gridview для выбора в табличных данных в скриптах PowerShell