#PSTip Get next available drive letter

Mapping drives is a routine task for IT pros—you choose a free drive letter, ranging from A-Z, and then use it to map a drive to a specific path. What if you need to do that in a script? How do you know which letter is available for the new drive?

Here at the magazine we dedicated a [Brain Teaser to find an unused drive letter][1] but we want to tell you of another, new, built-in way to get that information.

Windows 8 and Server 2012 ship with the Storage module which provides PowerShell cmdlets for end to end management of Windows storage. One of the module functions is Get-AvailableDriveLetter.

Update (8/20/2012)

In Windows 8 RTM, Get-AvailableDriveLetter is not a part of the Storage module.

However it will be included in a downloadable module at the TechNet Script Center in the near future.

In the meantime, you can put the code in your own Get-AvailableDriveLetter function.

Running the function without any parameters outputs all available drive letters:

PS> Get-AvailableDriveLetter

G
H
I
...
X
Y
Z

We can also ask for the first letter only:

PS> Get-AvailableDriveLetter -ReturnFirstLetterOnly
G

Finally, since this is a function, we can see how letters are retrieved by taking a look at the function definition:

PS> Get-Command Get-AvailableDriveLetter | Select-Object  –ExpandProperty Definition
param(
    [parameter(Mandatory=$False)]
    [Switch]
    $ReturnFirstLetterOnly
)

$volumeList = Get-Volume
# Get all available drive letters, and store in a temporary variable.
$UsedDriveLetters = @(Get-Volume | % { "$([char]$_.DriveLetter)"}) + @(Get-WmiObject -Class Win32_MappedLogicalDisk| %{$([char]$_.DeviceID.Trim(':'))})
$TempDriveLetters = @(Compare-Object -DifferenceObject $UsedDriveLetters -ReferenceObject $( 67..90 | % { "$([char]$_)" } ) | ? { $_.SideIndicator -eq '<=' } | % { $_.InputObject })

# For completeness, sort the output alphabetically
$AvailableDriveLetter = ($TempDriveLetters | Sort-Object)
if ($ReturnFirstLetterOnly -eq $true)
{
	$TempDriveLetters[0]
}
else
{
	$TempDriveLetters
}

For a list of the cmdlets contained in the Storage module, see the following topic [on TechNet][2]

[1]: /2012/01/12/find-an-unused-drive-letter/) [2]: http://technet.microsoft.com/en-us/library/hh848705.aspx

Share on: