Use ConsoleMonster when a selection workflow needs to stay in the terminal, including over SSH or on a host without Windows Desktop. Show-ConsoleGrid displays, filters and sorts ordinary object rows, then returns the selected objects. Show-ConsoleObject explores nested values. These are changes of interaction model, not drop-in replacements for every desktop-grid feature.
Project status, checked 25 October 2026
| Project or command | Verified status | Source |
|---|---|---|
Built-in Out-GridView | Available in PowerShell 7 on Windows Desktop only; unavailable on Server Core/Nano Server. It is not described here as discontinued. | Microsoft Learn |
Microsoft.PowerShell.GraphicalTools | Its Avalonia-based cross-platform Out-GridView is deprecated and unmaintained according to the repository README; development was paused pending a possible MAUI rewrite. Gallery version 0.2.0 was published 16 August 2019. | Maintainer notice #101, Gallery 0.2.0, README |
Microsoft.PowerShell.ConsoleGuiTools | Repository archived 24 June 2026. README calls it feature complete; v0.7.7 is the last feature release, published 1 May 2024. It already supported Windows, macOS and Linux. | Repository and archive banner, v0.7.7 |
ConsoleGuiTools points readers to a community continuation, PSTui. Consider it if keeping the original command names is your priority. ConsoleMonster is a separate renderer with different selection, layout and pipeline contracts.
Command map
| Existing operation | ConsoleMonster | Note |
|---|---|---|
Out-GridView for viewing only | Show-ConsoleGrid -OutputMode None | Stays in the terminal; blocks until closed. |
Out-GridView -OutputMode Single | Show-ConsoleGrid -OutputMode Single | Returns one original row. |
Out-GridView -PassThru or -OutputMode Multiple | Show-ConsoleGrid -OutputMode Multiple | Multiple is ConsoleMonster's default. |
Out-ConsoleGridView -OutputMode ... | Show-ConsoleGrid -OutputMode ... | Check filter grammar and key bindings. |
Out-ConsoleGridView -Filter | Show-ConsoleGrid -Filter | Text looks similar but the grammars differ. |
Show-ObjectTree | Show-ConsoleObject | Keyboard explorer; -PassThru explicitly returns a selection. |
| A fixed inventory report | Show-ConsoleTable | No interactive selection; -AsString for logs/tests. |
Shared sample data
Run Import-Module ConsoleMonster, then define these rows. Use the left-hand grid examples in the host/module that supplies that command. No example changes a service or machine.
$servers = @(
[pscustomobject] @{ Name = 'FS01'; Site = 'Warsaw'; Pending = 4; Status = 'Pass' }
[pscustomobject] @{ Name = 'SQL01'; Site = 'Dublin'; Pending = 12; Status = 'Warn' }
[pscustomobject] @{ Name = 'WEB01'; Site = 'Berlin'; Pending = 0; Status = 'Pass' }
)
1. Browse without returning selections
Before
$servers | Out-GridView -Title 'Patch inventory'
# ConsoleGuiTools:
$servers | Out-ConsoleGridView -Title 'Patch inventory' -OutputMode None
ConsoleMonster
$servers | Show-ConsoleGrid -Title 'Patch inventory' -OutputMode None
Specify None when migrating a viewer. Otherwise ConsoleMonster's default multiple-selection mode can emit rows into the next pipeline command. Both grids need objects, not native Format-Table records.
Install-Module ConsoleMonster -Scope CurrentUser# On a desktop with working Out-GridView, the native window remains in charge.
Import-Module ConsoleMonster
Enable-ConsoleFormatting -Feature GridView
$nodes = @(
[pscustomobject] @{ Name = 'api-east'; Region = 'eu-west'; Version = '2.4.1' }
[pscustomobject] @{ Name = 'worker-west'; Region = 'eu-west'; Version = '2.4.0' }
[pscustomobject] @{ Name = 'build-north'; Region = 'eu-north'; Version = '2.4.1' }
)
try {
$nodes | Out-GridView -Title 'Choose nodes' -OutputMode Multiple
} finally {
Disable-ConsoleFormatting -Feature GridView
}Run: ./example.ps1
dotnet new console -n ServicePicker
cd ServicePicker
dotnet add package ConsoleMonsterusing ConsoleMonster;
using ConsoleMonster.Interactive;
using ConsoleMonster.Text;
Grid grid = new Grid("Choose nodes") { Selection = GridSelection.Multiple };
grid.AddColumn("Name").AddColumn("Region").AddColumn("Version");
grid.AddRow("api-east", "api-east", "eu-west", "2.4.1");
grid.AddRow("worker-west", "worker-west", "eu-west", "2.4.0");
grid.AddRow("build-north", "build-north", "eu-north", "2.4.1");
GridResult selected = grid.Show();
foreach (object? node in selected.Items) {
Terminal.WriteMarkupLine(Markup.Escape(node?.ToString() ?? string.Empty));
}Run: dotnet run
Choose nodes 3 of 3 rows · 2 selected › type to filter ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Name Region Version │ │ ─ ─────────── ──────── ─────── │ │ ✓ api-east eu-west 2.4.1 │ │ ✓ worker-west eu-west 2.4.0 │ │ build-north eu-north 2.4.1 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ↑↓ move space select ctrl+enter done esc cancel enter details f3 sort f2 columns ? keys
Choose nodes 3 of 3 rows · 2 selected › type to filter ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Name Region Version │ │ ─ ─────────── ──────── ─────── │ │ ✓ api-east eu-west 2.4.1 │ │ ✓ worker-west eu-west 2.4.0 │ │ build-north eu-north 2.4.1 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ↑↓ move space select ctrl+enter done esc cancel enter details f3 sort f2 columns ? keys
Choose nodes 3 of 3 rows · 2 selected › type to filter ╭──────────────────────────────────────────────────────────╮ │ Name Region Version │ │ ─ ─────────── ──────── ─────── │ │ ✓ api-east eu-west 2.4.1 │ │ ✓ worker-west eu-west 2.4.0 │ │ build-north eu-north 2.4.1 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰──────────────────────────────────────────────────────────╯ ↑↓ move space select ctrl+enter done esc cancel
Choose nodes 3 of 3 rows · 2 selected › type to filter ╭──────────────────────────────────────────────────────────╮ │ Name Region Version │ │ ─ ─────────── ──────── ─────── │ │ ✓ api-east eu-west 2.4.1 │ │ ✓ worker-west eu-west 2.4.0 │ │ build-north eu-north 2.4.1 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰──────────────────────────────────────────────────────────╯ ↑↓ move space select ctrl+enter done esc cancel
This related runnable service-picker program shows real grid output at two widths, including its own sample data and selection code.
2. Pick one target
Before
$server = $servers | Out-GridView -OutputMode Single -Title 'Review one server'
# ConsoleGuiTools:
$server = $servers | Out-ConsoleGridView -OutputMode Single
ConsoleMonster
$server = $servers | Show-ConsoleGrid -OutputMode Single -Title 'Review one server'
if ($null -ne $server) {
$server | Show-ConsoleList
}
3. Keep objects for a later report
Before
$selected = @($servers | Out-GridView -PassThru)
$selected | Select-Object Name, Site, Pending
ConsoleMonster
$selected = @($servers | Show-ConsoleGrid -OutputMode Multiple)
$selected | Select-Object Name, Site, Pending
Check for an empty selection before invoking downstream operations. The example returns the original objects so numeric fields remain numeric; it does not scrape rendered text.
4. Filter and sort deliberately
Before
$servers | Out-ConsoleGridView -Filter 'SQL' -OutputMode Single
# Built-in Out-GridView has an interactive filter box, not a -Filter parameter.
ConsoleMonster
$servers | Show-ConsoleGrid -Filter 'SQL' -SortBy Pending -Descending -OutputMode Single
ConsoleGuiTools documents regular-expression filtering. ConsoleMonster uses its own grid search syntax; start with literal text and check grid behavior before porting advanced expressions. Desktop column dragging, criteria dialogs and clipboard gestures do not map one-for-one to terminal controls.
5. Explore a nested record
Before
$inventory = [pscustomobject] @{ CollectedBy = 'Inventory'; Servers = $servers }
$inventory | Show-ObjectTree
ConsoleMonster
$inventory = [pscustomobject] @{ CollectedBy = 'Inventory'; Servers = $servers }
$inventory | Show-ConsoleObject -Title 'Inventory object' -Depth 4
The default explorer is a viewer. Use -PassThru only when you want selected values; -SelectionOutput Path returns an inspection path instead. A path is descriptive output, not a command to evaluate. Object exploration includes real captures and bounded-depth options.
Differences to know
- Built-in Out-GridView opens a separate desktop window and can return immediately in view-only mode. ConsoleMonster occupies the terminal and owns input until it closes; there is no separate-window
-Waitlifecycle. Show-ConsoleGriddefaults toMultiple. ExplicitNone,SingleandMultiplemake migrated pipelines easier to review.- ConsoleMonster is not an
ogvorocgvalias. The optional GridView formatting feature is an unavailable-host adapter; prefer the explicit command when migrating scripts. - Filter syntax, selection keys, hidden columns and sorting are ConsoleMonster behavior. Follow the on-screen key hints and keep object projection in
Select-Objector-Property. - An unattended host cannot make an interactive choice. Supply the selection in script parameters; use
Show-ConsoleTable -AsStringfor a noninteractive report. A fallback or snapshot is not approval.
Next
Try object exploration, interactive screens or all migration guides.