You do not have to change your commands to get readable output. One line turns it on for the session:
Enable-ConsoleFormatting
Files and folders, processes, services, commands, modules, event log records, IP addresses, volumes and dictionaries are then shown as ConsoleMonster tables and records when they reach the console. Objects stay the same: pipelines into other commands, Format-*, Out-String, redirected output, transcripts, jobs and remoting keep PowerShell's behaviour. Disable-ConsoleFormatting turns it off.
To keep it on in every session, print the lines for your profile and paste them in (nothing is written for you):
Enable-ConsoleFormatting -ProfileSnippet
Before and after Enable-ConsoleFormatting
Processes, files and a hashtable, first as PowerShell shows them, then with ConsoleMonster turned on for the session, followed by services grouped by status.
PS> Get-ChildItem Directory: C:\Program Files\PowerShell\7\Modules ╭───────┬──────────────────┬────────┬────────────────────────────────────╮ │ Mode │ LastWriteTime │ Length │ Name │ ├───────┼──────────────────┼────────┼────────────────────────────────────┤ │ d---- │ 2026-09-15 03:17 │ │ CimCmdlets │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.PowerShell.Archive │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.PowerShell.Diagnostics │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.PowerShell.Host │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.PowerShell.Management │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.PowerShell.PSResourceGet │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.PowerShell.Security │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.PowerShell.ThreadJob │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.PowerShell.Utility │ │ d---- │ 2026-09-15 03:17 │ │ Microsoft.WSMan.Management │ │ d---- │ 2026-09-15 03:17 │ │ PackageManagement │ │ d---- │ 2026-09-15 03:17 │ │ PowerShellGet │ │ d---- │ 2026-09-15 03:17 │ │ PSDiagnostics │ │ d---- │ 2026-09-15 03:17 │ │ PSReadLine │ ╰───────┴──────────────────┴────────┴────────────────────────────────────╯ PS> @{ Domain = 'evotec.xyz'; Records = 14; DNSSEC = $false } DNSSEC – no Domain evotec.xyz Records 14 PS> Get-Service W* | Format-ConsoleTable -GroupBy Status -Top 6 ╭─────────────────────┬─────────────────────────────────────────────────────────╮ │ Name │ DisplayName │ ├─ Running · 6 of 22 ─┼─────────────────────────────────────────────────────────┤ │ W32Time │ Windows Time │ │ Wcmsvc │ Windows Connection Manager │ │ WdiServiceHost │ Diagnostic Service Host │ │ WdiSystemHost │ Diagnostic System Host │ │ WdNisSvc │ Microsoft Defender Antivirus Network Inspection Service │ │ WebManagement │ Web Management │ ╰─────────────────────┴─────────────────────────────────────────────────────────╯ Showing 6 of 47 · 1 of 2 groups
# Everyday commands as PowerShell shows them, then the same commands after one line: Enable-ConsoleFormatting.
$windows = $env:OS -eq 'Windows_NT'
$process = if ($windows) { @{ Name = 'svchost' } } else { @{ Id = $PID } }
# PowerShell's own output
Get-Process @process | Sort-Object CPU -Descending | Select-Object -First 8 | Out-Default
Get-ChildItem | Out-Default
@{ Domain = 'evotec.xyz'; Records = 14; DNSSEC = $false } | Out-Default
Enable-ConsoleFormatting
# The same commands now
Get-Process @process | Sort-Object CPU -Descending | Select-Object -First 8 | Out-Default
Get-ChildItem | Out-Default
@{ Domain = 'evotec.xyz'; Records = 14; DNSSEC = $false } | Out-Default
if ($windows) {
Get-Service W* | Format-ConsoleTable -GroupBy Status -Top 6
} else {
Get-Process @process | Format-ConsoleTable -GroupBy ProcessName -Top 6
}Full program
# Everyday commands as PowerShell shows them, then the same commands after one line: Enable-ConsoleFormatting.
$windows = $env:OS -eq 'Windows_NT'
$process = if ($windows) { @{ Name = 'svchost' } } else { @{ Id = $PID } }
# The hidden lines only print the prompt before each command, as a terminal would.
function Write-Prompt([string] $Command) { Start-Sleep -Milliseconds 700; Write-Host "PS> $Command" -ForegroundColor Yellow; Start-Sleep -Milliseconds 400 }
Set-Location -LiteralPath (Join-Path $PSHOME 'Modules')
Write-Prompt "# PowerShell's own output"
Write-Prompt ("Get-Process $(if ($windows) { 'svchost' } else { "-Id $PID" }) | Sort-Object CPU -Descending | Select-Object -First 8")
# PowerShell's own output
Get-Process @process | Sort-Object CPU -Descending | Select-Object -First 8 | Out-Default
Write-Prompt 'Get-ChildItem'
Get-ChildItem | Out-Default
Write-Prompt '@{ Domain = ''evotec.xyz''; Records = 14; DNSSEC = $false }'
@{ Domain = 'evotec.xyz'; Records = 14; DNSSEC = $false } | Out-Default
Write-Prompt 'Enable-ConsoleFormatting'
Enable-ConsoleFormatting
Write-Prompt '# The same commands now'
Write-Prompt ("Get-Process $(if ($windows) { 'svchost' } else { "-Id $PID" }) | Sort-Object CPU -Descending | Select-Object -First 8")
# The same commands now
Get-Process @process | Sort-Object CPU -Descending | Select-Object -First 8 | Out-Default
Write-Prompt 'Get-ChildItem'
Get-ChildItem | Out-Default
Write-Prompt '@{ Domain = ''evotec.xyz''; Records = 14; DNSSEC = $false }'
@{ Domain = 'evotec.xyz'; Records = 14; DNSSEC = $false } | Out-Default
Write-Prompt $(if ($windows) { 'Get-Service W* | Format-ConsoleTable -GroupBy Status -Top 6' } else { "Get-Process -Id $PID | Format-ConsoleTable -GroupBy ProcessName -Top 6" })
if ($windows) {
Get-Service W* | Format-ConsoleTable -GroupBy Status -Top 6
} else {
Get-Process @process | Format-ConsoleTable -GroupBy ProcessName -Top 6
}
Start-Sleep -Milliseconds 600
Disable-ConsoleFormattingUse it in every session
Install-Module ConsoleMonster -Scope CurrentUser
Enable-ConsoleFormatting -ProfileSnippetReference: Enable-ConsoleFormatting
Arrays in cells and groups
Format-Table beside Format-ConsoleTable -GroupBy on the same objects: roles as a list, durations as durations, statuses with their symbol, one heading per site.
── Format-Table ──────────────────────────────────────────────────────────────────────────────────── Name Site Roles LastSync Status ---- ---- ----- -------- ------ DC01 Warsaw {DNS, GC, PDC} 00:00:42 Pass DC02 Warsaw {DNS, GC} 00:42:00 Warn DC03 Dublin {DNS, GC, RID, Infrastructure…} 00:01:04 Pass DC04 Dublin {} 04:00:00 Fail ── Format-ConsoleTable -GroupBy Site ─────────────────────────────────────────────────────────────── ╭──────────────┬───────────────────────────────────────────┬───────────┬────────╮ │ Name │ Roles │ LastSync │ Status │ ├─ Dublin · 2 ─┼───────────────────────────────────────────┼───────────┼────────┤ │ DC03 │ DNS, GC, RID, Infrastructure, Schema … +1 │ 1 m 04 s │ ✓ Pass │ │ DC04 │ — │ 4 h 00 m │ ✗ Fail │ ├─ Warsaw · 2 ─┼───────────────────────────────────────────┼───────────┼────────┤ │ DC01 │ DNS, GC, PDC │ 42 s │ ✓ Pass │ │ DC02 │ DNS, GC │ 42 m 00 s │ ▴ Warn │ ╰──────────────┴───────────────────────────────────────────┴───────────┴────────╯
# Arrays in cells and groups: the built-in Format-Table beside Format-ConsoleTable, on the same objects.
$servers = @(
[pscustomobject] @{ Name = 'DC01'; Site = 'Warsaw'; Roles = 'DNS', 'GC', 'PDC'; LastSync = (New-TimeSpan -Seconds 42); Status = 'Pass' }
[pscustomobject] @{ Name = 'DC02'; Site = 'Warsaw'; Roles = 'DNS', 'GC'; LastSync = (New-TimeSpan -Minutes 42); Status = 'Warn' }
[pscustomobject] @{ Name = 'DC03'; Site = 'Dublin'; Roles = 'DNS', 'GC', 'RID', 'Infrastructure', 'Schema', 'Naming'; LastSync = (New-TimeSpan -Seconds 64); Status = 'Pass' }
[pscustomobject] @{ Name = 'DC04'; Site = 'Dublin'; Roles = @(); LastSync = (New-TimeSpan -Hours 4); Status = 'Fail' }
)
Write-ConsoleRule 'Format-Table'
$servers | Format-Table | Out-Host
Write-ConsoleRule 'Format-ConsoleTable -GroupBy Site'
$servers | Format-ConsoleTable -GroupBy SiteUse it in your script
Install-Module ConsoleMonster -Scope CurrentUserReference: Format-ConsoleTable
Collections in a cell are joined (DNS, GC, PDC), with a +N marker for the items that do not fit, where Format-Table shows {DNS, GC, PDC} and cuts long lists short. Durations read as 42 s or 4 h 00 m, an empty collection is a dash, and status words get their symbol and colour. -GroupBy writes a labelled heading per group, with its count.
More from the same switch
Enable-ConsoleFormatting -Feature ErrorViewand-Feature Progressadd the error view and the progress area.Register-ConsoleViewadds your own types: a view per type name with the columns you choose.Format-ConsoleTable,Format-ConsoleListandFormat-ConsoleTreegive the same views on demand, with column options; see Coming from Format-Table.