Powershell: Properly coloring Get-Childitem output once and for all
I just installed and used https://github.com/Davlind/PSColor which was painless. It supports PSGet so you can install easily with Install-Module PSColor
to get it.
Note There is an updated fork of PSColor available as Color: https://www.powershellgallery.com/packages/Color/2.1.0 (Thanks @HackSlash)
The objects aren't transformed so they still support piping. (It's using the New-CommandWrapper
mentioned above)
It also supports other things like select-string.
Modifying Out-Default is definitely the way to go. Below a - granted, sloppy - example. I'm using New-CommandWrapper from the PowerShell Cookbook.
New-CommandWrapper Out-Default `
-Process {
if(($_ -is [System.IO.DirectoryInfo]) -or ($_ -is [System.IO.FileInfo]))
{if(-not ($notfirst)) {
Write-Host " Directory: $(pwd)`n"
Write-Host "Mode LastWriteTime Length Name"
Write-Host "---- ------------- ------ ----"
$notfirst=$true
}
if ($_ -is [System.IO.DirectoryInfo]) {
Write-host ("{0,-7} {1,25} {2,10} {3}" -f $_.mode, ([String]::Format("{0,10} {1,8}", $_.LastWriteTime.ToString("d"), $_.LastWriteTime.ToString("t"))), $_.length, $_.name) -foregroundcolor "yellow" }
else {
Write-host ("{0,-7} {1,25} {2,10} {3}" -f $_.mode, ([String]::Format("{0,10} {1,8}", $_.LastWriteTime.ToString("d"), $_.LastWriteTime.ToString("t"))), $_.length, $_.name) -foregroundcolor "green" }
$_ = $null
}
}
I have another script which takes care of Format-Wide
(ls
) case and also has better performance by using dictionaries instead of regex: https://github.com/joonro/Get-ChildItem-Color.