Skip to main content

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

 

 

 

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.

Popular posts from this blog

How to force a DNS zone to replicate

For many implementations of DNS in a Windows environment, DNS is configured as being Active Directory integrated.  In other words, the DNS zone information is actually stored as a partition in the active directory database.  When Active Directory replicates, the zone data transfers.  For standard DNS deployments, the data is stored in a file.  You have to configure zone transfers manually in the DNS console.   The question in class was how to initiate replication manually.  Once you have properly configured a Primary and secondary DNS server and configured the Primary server to allow zone transfers, you can manually initiate a zone transfer.   Below you can see our test environment.  The image is of to RDP sessions to two different servers.  The DNS console on the left is the primary.  You can see and entry for Test2 that is not in the secondary database.  The servers are named NYC-DC2 (Primary DNS) and NYC-DC1 (Secondary DNS).  The DNS zone is named test.contoso.com . On the se

Disable SMB signing

It never fails.  Once ever couple of months I have a delegate in my class that has to keep a Windows NT4 box running.  There is nothing wrong with that.  Many applications build on Windows NT4 are solid.  Why upgrade and incur cost when no upgrade is really required?  That is generally the reason why Windows NT4 is being used.  Another reason is the vender went out of business, but the application that is required is really good and paid for. Two things to take note of.  If these Windows NT4 clients are going to be authenticating on a Windows Sever 2008 DC, then you may have a problem.  For WinNT 4.0 SP2 and earlier, SMB signing was not supported.  For WinNT4.0 SP3 and earlier, secure channel was not supported. SMB signing helps to prevent Man-in-the-middle attacks.  To open GPMC, click Start , click Run , type gpmc.msc , and then click OK . In the console tree, right-click Default Domain Controllers Policy in Domains\ Current Domain Name \Group Policy objects\Default Domain Co

Export Your Performance Monitor Data to Excel

Updated: 2016MAY04 To clarify when this functionality is available, you can only save the view when you are viewing a Data Collection Set.  The "live" data cannot be saved in this way. Performance Monitor in Windows Server give us the ability to see when our servers are having some issues.  Analyzing that data into something meaningful can be a problem.  You can export your data to Excel so you can better see what your performance data represents.  First collect your data. Right click the graph and select Save Data As . Change the Save as type to Text file (comma delimited)(*.csv) . Give the file a name and save it where you want to store it. Now open that file on a client with Excel installed on it.  By using excel, you will be able to present the data in a more meaningful format.