Advanced Windows PowerShell Scripting Video Training

Advanced Windows PowerShell Scripting Video Training
Advanced Windows PowerShell Scripting Video Training

Thursday, June 19, 2014

How to filter out objects from Get-Volume that do not have a drive letter

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"} 

 

 

 

2 comments:

phuzz said...

Thank you! This little problem was driving me up the wall!
I even tried Get-Volume | Where-Object {![string]::IsNullOrEmpty($_.DriveLetter)} but I never thought it would be an escape character.

Anonymous said...

Brilliant! Spent way to much time on this. Thank you very much.