While delivering a PowerShell class this week, I utilized the Get-Volume cmdlet to help me demonstrate filtering with Where-Object. I came across a small problem. Take a look at this output.
PS C:\> Get-Volume | Select -Property DriveLetter, FileSystem, Drivetype
DriveLetter FileSystem DriveType
----------- ---------- ---------
D NTFS Fixed
C NTFS Fixed
E NTFS Fixed
NTFS Fixed
NTFS Fixed
NTFS Fixed
I attempted to filter out all DriveTypes that did not have a drive letter.
The following did not filter at all.
Get-Volume | Select -Property DriveLetter, FileSystem, Drivetype |
Where-Object {$_.DriveLetter -ne $Null}
Get-Volume | Select -Property DriveLetter, FileSystem, Drivetype |
Where-Object {$_.DriveLetter -ne ""}
Get-Volume | Select -Property DriveLetter, FileSystem, Drivetype |
Where-Object {$_.DriveLetter -ne " "}
Somewhere, there was a hidden character. I first focused to the DriveLetter property on one of the objects that did not have a DriveLetter.
$D = Get-Volume | Select -Property DriveLetter, FileSystem, Drivetype
$D[4].DriveLetter
Next I decided to discover the ASCII code for this hidden character
[int][char]$D[4].DriveLetter
It was zero
Filtering for zero did not work.
Get-Volume | Select -Property DriveLetter, FileSystem, Drivetype |
Where-Object {$_.DriveLetter -ne 0}
One of my students suggested looking at the escape characters. Sure enough, `0 means NULL. Take a look at this excerpt from About_Escape_Characters
The following special characters are recognized by Windows PowerShell:
`0 Null
`a Alert
`b Backspace
`f Form feed
`n New line
`r Carriage return
`t Horizontal tab
`v Vertical tab
Now this works:
Get-Volume | Select -Property DriveLetter, FileSystem, Drivetype |
Where-Object {$_.DriveLetter -ne "`0"}
Comments
I even tried Get-Volume | Where-Object {![string]::IsNullOrEmpty($_.DriveLetter)} but I never thought it would be an escape character.