PowerShell How-To
How To Format PowerShell Output with Format-Table
- By Adam Bertram
- 06/13/2018
You may not think too often about how text is displayed in your PowerShell console, but under the covers, there's quite a bit going on.
Think about all of the commands you have the ability to run in PowerShell, with each having thousands of different object names and values. PowerShell can't just return the raw output of all of that stuff. It would be a mess!
Luckily, PowerShell does an excellent job of automatically formatting output for us, but there are times when we want our own method of formatting. One command to change the default format is the Format-Table cmdlet.
To understand how the Format-Table cmdlet works, you'll first need to understand a bit about how PowerShell's formatting type system works. To demonstrate, I'll call the Get-Process cmdlet.
PS C:\> Get-Process | ft
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
87 5 1108 4728 0.00 1432 13 CExecSvc
39 4 1680 3024 0.00 10820 13 cmd
94 8 3696 7716 0.09 11108 13 conhost
224 11 1872 4688 0.19 908 13 csrss
0 0 0 4 0 0 Idle
810 24 5124 15120 0.17 7824 13 lsass
Notice how it returns seven columns of values. These columns are in a table format versus the list format that you get when using Format-List, as shown below.
PS C:\> Get-Process | Format-List
Id : 1432
Handles : 85
CPU : 0
SI : 13
Name : CExecSvc
Id : 10820
Handles : 39
CPU : 0
SI : 13
Name : cmd
Format-Table forces the text to be displayed in a table but Get-Process output is already in tabular format. I could pipe Get-Process directly to Format-Table, but it would have no difference at all in the way the output looks.
However, what if I use Select-Object to get all of the properties that Get-Process returns? By default, Get-Process only shows a few important properties.
You can see below that the output is now in list format because it can't fit all of the properties across the screen.
PS C:\> Get-Process | Select-Object -Property Name,Id,Description,FileVersion,Threads -First 1
Name : CExecSvc
Id : 1432
Description : Container Execution Agent
FileVersion : 10.0.14393.0 (rs1_release.160715-1616)
Threads : {8008, 8688, 6340, 5184}
However, I know that all of those properties will fit on my screen. I need to override the default formatting. This is where Format-Table comes into play. By piping the output of any command such as the one we have here, I can force the output to be in a tabular format.
PS C:\> Get-Process | Select-Object -Property Name,Id,Description,FileVersion,Threads -First 1 | Format-Table
Name Id Description FileVersion Threads
---- -- ----------- ----------- -------
CExecSvc 1432 Container Execution Agent 10.0.14393.0 (rs1_release.160715-1616) {8008, 8688, 6340, 5184}
The Format-Table cmdlet is a cmdlet that will always be used last in the pipeline. Like the other formatting cmdlets, Format-Table doesn't return any objects to the pipeline and thus should always be last.
The Format-Table has a lot of different options to manipulate the text once it's displayed, as well. Some common parameters are AutoSize, which automatically sizes the output based on the width of your console, and HideTableHeaders, which doesn't display the object property names.
For a complete breakdown, check out the help content by using Get-Help Format-Table -Detailed. This will break down all of the various incarnations that are possible with the Format-Table cmdlet.
About the Author
Adam Bertram is a 20-year veteran of IT. He's an automation engineer, blogger, consultant, freelance writer, Pluralsight course author and content marketing advisor to multiple technology companies. Adam also founded the popular TechSnips e-learning platform. He mainly focuses on DevOps, system management and automation technologies, as well as various cloud platforms mostly in the Microsoft space. He is a Microsoft Cloud and Datacenter Management MVP who absorbs knowledge from the IT field and explains it in an easy-to-understand fashion. Catch up on Adam's articles at adamtheautomator.com, connect on LinkedIn or follow him on Twitter at @adbertram or the TechSnips Twitter account @techsnips_io.