Skip to content
ConsoleMonster

Coming from Show-Command

Replace Windows command dialogs with explicit terminal forms, validated answers and command previews.

A terminal form is useful when a guided operation must work over SSH or without Windows Desktop. ConsoleMonster can collect typed fields, validate them and show a command preview while your script retains control over execution. This replaces the workflow of a Show-Command dialog; it does not automatically generate a form for every installed cmdlet or reproduce Show-Command's command browser.

Status and scope

Microsoft documents Show-Command as Windows-only, reintroduced in PowerShell 7 and requiring Windows Desktop. It is unavailable on Server Core and Nano Server. Checked 25 October 2026. It ships with PowerShell, so it has no independent module release date; this guide makes no claim that it is abandoned.

Operation map

Show-Command workflowConsoleMonsterDifference
Show-Command -Name Get-ServiceNew-ConsoleForm and New-ConsoleFieldDefine fields explicitly; no automatic metadata-to-form bridge.
Type parameters, then RunRead-ConsoleForm, then an explicit command callSubmission returns answers; your script chooses what to execute.
Show-Command -PassThruRead-ConsoleForm -PassThru / Format-ConsoleCommandFull form result includes Submitted, Values and CommandLine; a preview is text.
Browse available commandsShow-ConsoleHelp / Get-CommandHelp and discovery are separate from form entry.
Parameter-set tabsExplicit fields/pages and validationModel only the supported task; no automatic parameter-set parity.

Shared sample data

Use these illustrative rows while preparing a service-inventory query. The sample asks for a server name; it does not connect to the sample machines.

Import-Module ConsoleMonster
$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. Replace a command dialog with focused questions

Before

# Windows Desktop; fills the native command dialog.
Show-Command -Name Get-Service

ConsoleMonster

$form = New-ConsoleForm -Title 'Service inventory' -Command 'Get-Service' -Content {
    New-ConsoleField -Key Name -Label 'Service name' -Type Text `
        -Required -ParameterName Name
}
Set-ConsoleFormValue -Form $form -Values @{ Name = 'WinRM' }
$answers = $form | Read-ConsoleForm
if ($null -ne $answers) {
    Get-Service -Name $answers.Name
}

The right-hand example deliberately models one read-only command parameter. Get-Service itself is Windows-only in modern PowerShell, so run that last call on Windows; forms are cross-platform, target commands may not be. To use a cross-platform target, replace the command and fields with those of your own inventory function.

2. Preview a command without executing it

Before

# Show-Command returns command text instead of running it.
$command = Show-Command -Name Get-Service -PassThru

ConsoleMonster

$form = New-ConsoleForm -Title 'Service inventory' -Command 'Get-Service' -Content {
    New-ConsoleField -Key Name -Label 'Service name' -Type Text `
        -Required -ParameterName Name
}
Set-ConsoleFormValue -Form $form -Values @{ Name = 'WinRM' }
$result = $form | Read-ConsoleForm -PassThru
if ($result.Submitted) {
    Write-ConsoleText -Text $result.CommandLine
}

The initial WinRM value is applied explicitly. Form command previews omit values equal to a field default, so use field defaults only when omitting that parameter has the same meaning for the target command.

-PassThru has different return types: Show-Command returns command text, while Read-ConsoleForm returns a structured result. Keep that result test separate from an execution decision. Never feed preview text to Invoke-Expression; call the command with a reviewed splat.

3. Build a reviewable invocation from selected rows

Before

# Windows Desktop: choose connection parameters for remoting.
$command = Show-Command -Name Invoke-Command -PassThru

ConsoleMonster

$server = $servers | Read-ConsoleSelect 'Inventory target' -Display Name
$arguments = @{ Server = $server.Name; IncludeStopped = $true }
$command = Format-ConsoleCommand -Command 'Get-ServerInventory' -Arguments $arguments
Write-ConsoleText -Text $command
# Preview only. If your function exists, call it explicitly with @arguments.

Format-ConsoleCommand quotes values for a copyable command string and does not execute it. The right side models a custom Get-ServerInventory command; it does not require that function just to create the preview. Only execute your real function after validating and selecting its arguments.

Differences to know

  • New-ConsoleForm creates a definition; Read-ConsoleForm owns input and returns answers only after submission. Without -PassThru, cancellation yields no submitted answer object.
  • Field Key identifies stored answers, Label is visible text and ParameterName controls command preview binding. They need not be identical.
  • Form review and validation are task-specific. Show-Command discovers parameter sets dynamically; ConsoleMonster expects you to define the supported operation.
  • Persistence is explicit through form options. Do not enable remembered answers for secrets just to imitate a dialog.
  • Previewing a command does not validate authorization, reachability or target-platform support, and does not execute the command. The calling script owns that decision.

See a complete form

This small form collects a service name without executing anything. Its initial screen comes from the exact program shown below. The interactive wizard demonstrates a larger form with dependent fields and a command review.

Install-Module ConsoleMonster -Scope CurrentUser
PowerShellform.ps1
$form = New-ConsoleForm -Title 'Service inventory' -Content {
    New-ConsoleField -Key Name -Label 'Service name' -Type Text -Default 'WinRM' -Required
}
$answers = $form | Read-ConsoleForm
# Collect answers only. The caller decides whether to execute a command.
Full program
Import-Module ConsoleMonster

$form = New-ConsoleForm -Title 'Service inventory' -Content {
    New-ConsoleField -Key Name -Label 'Service name' -Type Text -Default 'WinRM' -Required
}
$answers = $form | Read-ConsoleForm
# Collect answers only. The caller decides whether to execute a command.

Run: ./form.ps1

Terminal
dotnet new console -n ServiceSetup
cd ServiceSetup
dotnet add package ConsoleMonster
C#Program.cs
Form form = new Form("Service inventory");
TextField name = form.Text("Name", "Service name");
name.Default = "WinRM";
name.Required = true;
FormResult result = form.Show();
// Collect answers only. The caller decides whether to execute a command.
Full program
using ConsoleMonster.Interactive;

Form form = new Form("Service inventory");
TextField name = form.Text("Name", "Service name");
name.Default = "WinRM";
name.Required = true;
FormResult result = form.Show();
// Collect answers only. The caller decides whether to execute a command.

Run: dotnet run

Service inventory form 80 columns24-bitFull

Next

Explore interactive screens, the form command reference or all migration guides.

Edit this page on GitHub