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 run GPResult on a remote client with PowerShell

In the past, to run the GPResult command, you would need to either physically visit this client, have the user do it, or use and RDP connection.  In all cases, this will disrupt the user.  First, you need PowerShell remoting enabled on the target machine.  You can do this via Group Policy . Open PowerShell and type this command. Invoke-Command –ScriptBlock {GPResult /r} –ComputerName <ComputerName> Replace <ComputerName> with the name of the target.  Remember, the target needs to be online and accessible to you.

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