Sometimes PowerShell truncates output, and if you don’t realise what’s going on, you’ll never get it to show.
Where you’re expecting potentially lots more text, PowerShell replaces it with a single lousy ellipsis, cruelly taunting you.
Column Width
If it’s just a column width problem, the fix is simple enough: just pipe to out-string
and add the width parameter.
Before:
PS > Get-CsAnalogDevice | ft Identity,RegistrarPool Identity RegistrarPool -------- ------------- CN=Public Telephone,OU=RTC Special Accounts,DC=contoso,D... lync2010.contoso.local CN=Linksys ATA,OU=RTC Special Accounts,DC=contoso,DC=local lync2010.contoso.local CN=HOTLINE,OU=RTC Special Accounts,DC=contoso,DC=local lync2010.contoso.local CN=Paging Speaker,OU=RTC Special Accounts,DC=contoso,DC=... lync2010.contoso.local
After:
PS > Get-CsAnalogDevice | ft Identity,RegistrarPool | out-string -Width 160 Identity RegistrarPool -------- ------------- CN=Public Telephone,OU=RTC Special Accounts,DC=contoso,DC=local lync2010.contoso.local CN=Linksys ATA,OU=RTC Special Accounts,DC=contoso,DC=local lync2010.contoso.local CN=HOTLINE,OU=RTC Special Accounts,DC=contoso,DC=local lync2010.contoso.local CN=Paging Speaker,OU=RTC Special Accounts,DC=contoso,DC=local lync2010.contoso.local
Collections / Arrays
… but what if that doesn’t fix it?
It might be that the object you’re looking at is an array (a “collection”), and PowerShell is only showing the first few entries in that array, rather than the lot.
Here, the fix is to change the $FormatEnumerationLimit
value. If you type it on its own into PowerShell the current value – probably 3 – will be returned. If you set a new value of -1, it’ll output ALL entries in your collection.
PS > $FormatEnumerationLimit 3 PS > $FormatEnumerationLimit=-1
Before:
PS > Get-CsCertificate
Issuer : CN=contoso-CA, DC=contoso, DC=local
NotAfter : 6/07/2013 5:09:37 PM
NotBefore : 17/02/2012 7:04:52 PM
SerialNumber : 1234567890ABCDEF
Subject : CN=lync2010.contoso.local, OU=IT, O=contoso, L=Sydney, S=NSW, C=AU
AlternativeNames : {sip.contoso.net, lync2010.contoso.net, lync2010.contoso.local...}
Thumbprint : 1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF
Use : Default
After:
PS > Get-CsCertificate Issuer : CN=contoso-CA, DC=contoso, DC=local NotAfter : 6/07/2013 5:09:37 PM NotBefore : 17/02/2012 7:04:52 PM SerialNumber : 1234567890ABCDEF Subject : CN=lync2010.contoso.local, OU=IT, O=contoso, L=Sydney, S=NSW, C=AU AlternativeNames : {sip.contoso.net, lync2010.contoso.net, lync2010.contoso.local, dialin.contoso.net, admin.contoso.net, meet .contoso.net, LyncdiscoverInternal.contoso.net, lyncweb.contoso.net, Lyncdiscover.contoso.net} Thumbprint : 1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF Use : Default
Credit: This post is largely a re-write of this AWESOME Poshoholic gem.
Here’s a TechNet post with a few more formatting tips.
Thanks! This really helped me!!!
Thanks.
I tried several other suggestions without success.
This one work great and I get all the output without truncate
Excellent post, $formatenumerationlimit had been REALLY hampering my productivity using PowerShell, thanks!
Life saver, thank you very much.
Lifesaver, very useful post.
Thanks Grieg, saved me a lot of trouble. Great tip.
Sadly I’m late to the party, but here I am…
Sadly this doesn’t work for me with WMF 5.1 :-/
Thanks this have worked for
get-unified group | fl
but did not work
get-unified group | select EmailAddresses
Any idea?
Thanks!
This is the correct answer!
Also, PS’ Format-Table will truncate a columned response after that entry’s first 4 items. So if you were looking up a prefix list of addresses you’d only see the first four of them, with the feared ellipses following.
But this breaks that problem as well. Good work
“-Width”, so simple, yet saved me so much grief, thanks!
Spent all day trying to get PS to work and this saved me from giving up.
One issue i have is, why can i export to TXT but not CSV?
Zorgh, how are you doing this? Are you trying “get-something | export-csv” or doing it differently?
If you’re getting an unwanted header in the CSV file, just add “-NoTypeInformation” to the export cmdlet.
– G.
Search a lot, $FormatEnumerationLimit was the real solution for extending the string output powershell format!
Thank you!
Great help – especially for commands like Get-CsRgsHolidaySet where the output is typically truncated.
Sill problems with “$FormatEnumerationLimit=-1”. I fixed width size not that usable in my case
“””
$logName = ‘Microsoft-Windows-DNS-Client/Operational’
$log = New-Object System.Diagnostics.Eventing.Reader.EventLogConfiguration $logName
$log.IsEnabled=$true
$log.SaveChanges()
$FormatEnumerationLimit=-1
Get-WinEvent -LogName Microsoft-Windows-DNS-Client/Operational | where { $_.ID -gt 1010 }
“””
$FormatEnumerationLimit = -1
Clear-Host
Get-WinEvent -LogName ‘System’ -FilterXPath ‘
*
[System
[(
(EventID >= 4608 and EventID <= 4609)
or EventID=4624
or EventID=4634
or EventID=4647
or (EventID >= 4778 and EventID <= 4779)
or (EventID >= 4800 and EventID <= 4803)
)]
]
[EventData
[Data
[@Name=”SubjectUserName” or @Name=”TargetUserName”] and (Data=”username”)
]
]
*[
EventData[(Data[@Name=”LogonType”]=”7″)]
]
‘ | Out-String -Width 500
Thanks Greg, this helped me out.
Thank you!!!
Using $FormatEnumerationLimit is perfect! Thank you for this article, was a great help.
$FormatEnumerationLimit is the ANSWER for me
Thank you so much!
I’m wondering if there is a way that I can hint or force column widths in my own PS scripts, while still outputting a custom ps object?
Hi Mark,
Great question, but I don’t think you’re going to like the answer. I think you’re going to hit the same brick wall I did when I was trying to manually control column widths in https://greiginsydney.com/compare-objects-ps1/
Check out the two images in this tweet: the first is the problem I was trying to solve, and in the code extract in the next image is the bit you THINK is your salvation, the “width=” code.
that code snipped will work beautifully on your Windows 7 and 8 test machines, your servers … and then you’ll test it on Windows 10 and it will all turn to kaka – the first image.
The apparent cause is a deliberate change the P$ team made:
“When you use the Format-Table command, table columns are now automatically formatted by evaluating the first 300ms of data that passes through the stream.” – and that seems to mean it’s *ignoring* your hard-coded widths.
Things might have changed since then, as I’ve not revisited it.
i wish you the best of luck!!
– G.
One more for you: if you’re REALLY keen, P$ MVP Kirk Munro suggested this:
“Out of curiousity, have you tried defining the layout in a format.ps1xml file to see how well that works?
Have a look at Get-Service — that command returns strictly formatted data. Strictly formatted data using format.ps1xml files does not get undone by the 300ms “smart formatter”.”
I didn’t go there as it seemed like an ENORMOUS amount of effort to go to for my little script.
– G.
I love you.
How to get full InstanceId in this case?
1) $FormatEnumerationLimit set to -1
2) sending output to txt file doesn’t help
3) adding |out-string -Width 160 changes only first column, not the instnaceIds
PS C:\WINDOWS\system32> Get-PnpDevice -FriendlyName “*brother*”
Status Class FriendlyName InstanceId
—— —– ———— ———-
OK PrintQueue Brother DCP-J105 Printer SWD\PRINTENU…
OK SoftwareDevice Brother DCP-J105 [945330b5c59e] SWD\DAFWSDPR…
OK PrintQueue Brother DCP-J105 Printer (Copy 1) SWD\PRINTENU…
OK Image Brother DCP-J105 [945330b5c59e] SWD\DAFWSDPR…
OK Printer Brother DCP-J105 Printer SWD\PRINTENU…
OK Image Brother DCP-J105 LAN ROOT\IMAGE\0000
OK Image Brother DCP-J105 LAN ROOT\IMAGE\0001
OK WSDPrintDevice Brother DCP-J105 [945330b5c59e] SWD\DAFWSDPR…
Try this:
Another approach is to just pipe it to format-table’s ‘wrap’, which will show the lot + reveal long fields:
Thanks, this really helped me get the full length of an array on Exchange output, but I’ll note, it’s simply crazy the hoops I had to jump though just to get powershell to enumerate the entire list into a readable string. Makes me appreciate nix shell (i.e. Bash) even more. As always, MS complicates things more than necessary
Hi Greig,
how to get the entire synopsis in a search ? I’m afraid it’s an array and we get only the 1st record.
get-help about_* | where {$_.synopsis -match “block”}|ft -wrap
with this we don’t get about_testdrive for example
Hi Thierry.
I’ve had several goes at this and drawn a blank each time. I suspect it has something to do with the object type, which is “HelpInfoShort”.
Interestingly, if you capture “get-help about_BeforeEach_AfterEach”, the synopsis that comes out is a ‘mid-string’ extract, where you’d expect it to start from the start and then be truncated.
e.g.
PS C:\> $about = get-help about_BeforeEach_AfterEach
PS C:\> $about.Synopsis
performed at the beginning and end of every It block. This can eliminate duplication of code
I’ve asked around the MVPs to see if anyone can shed any light on the issue.
– Greig.
The issue here is a combination of a bug in Get-Help and a limitation in about_* help files.
All about_* help files are just text files. They have a recommended structure that they should follow, but ultimately they are just text. Not HTML. Not Markdown. Just text. Since they are just text, which may or may not follow the recommended structure, it is difficult to harvest “properties” from them. That is the limitation that you’re facing right now.
The bug is very clearly highlighted by the fact that `Get-Help -Category HelpFile | where Synopsis -match ‘block’ | Format-Table -Wrap` (note, the first segment of that pipeline is a better way to get help files than Get-Help about_*) does not return the full synopsis. Instead it only shows the first line of the synopsis for each of the loosely structured files in question. I would argue that is a bug, and that Get-Help -Category HelpFile is being lazy when it comes to trying to parse this loosely structured information. It could do better, by trying harder to pull out the full synopsis and parsing help files based on each of the recommended sections. It won’t be perfect, but it could be much better. If I recall correctly I did work related to this long ago when I worked on the PowerGUI team, harvesting the full information available in help files by the main “properties” that are defined by the headers. That’s work from 9+ years ago now though.
Does not work with PowerShell 7 and Get-Help
Thanks you very much but its not going to work with powershell core. It will only work with windows powershell 5.1.
Not working:
$FormatEnumerationLimit =-1
Get-NetFirewallAddressFilter | ft -Property *
output:
Any Any 192.168.77… 192.168.7… {9505679E-2214-48A2-A283-9CC9D02D97DB}
Hi Bartosz,
I think your problem here is simply that there’s simply too much information to show on the screen when output with format-table (“ft”). Select fewer properties – or format-list (“fl”) and it’s fine.
Does this give you enough information?
– Greig.