Weisheiten - der Netz-Weise Blog
Freie Laufwerke finden mit Powershell
Zum Vergeben eines Laufwerksbuchstaben muß man zuerst einmal evaluieren, welchen Laufwerksbuchstabe frei ist. Es gibt eine Reihe Ansätze, aber dieser hier ist für Lernzwecke ganz interessant. Die folgende Funktion wandelt die Asciicodes der Buchstaben C (Ascii 67) bis Z (Ascii 90) in Buchstaben um. Die Buchstaben werden der Reihe nach in einer Foreach-Schleife mit Test-Path gegen die vorhandenen Pfade überprüft. Sobald Test-Path False zurück gibt, wird die Schleife per "break" abgebrochen und der gefundene Buchstabe zurück gegeben.
Interessant in diesem Zusammenhang ist auch die Invertierung der Suche. Um beim letzten Buchstaben zu beginnen, wird einfach der Startbuchstabe auf Z gesetzt und die Auflistungsreihenfolge umgedreht ( $Counter..67 bzw. $Counter..90). Allerdings ist der Default-Wert für den Startbuchstaben auf C gesetzt, so dass eine Invertierung der Suche ohne setzen des Startbuchstabens normalerweise kein Ergebnis liefert. Eine Lösung bietet die automatische Variable $PSBoundParameter. Diese Variable wird automatisch erstellt, wenn beim Aufruf einer Funktion Übergabeparameter vom Benutzer verwendet werden. Die Methode Containskey() überprüft, ob ein Parameter vorhanden ist oder nicht.
function get-freedrive
{
<#
.SYNOPSIS
Get-Freedrives lists the first free driveletter in the alphabet.
.DESCRIPTION
Get-Freedrive can be used to test for the first available free driveletter. The Parameter $inverse searches backwards through the alphabet.
.EXAMPLE
get-freedrive -inverse -startLetter Z
Starts the search with letter z searching backwards. Returns a character.
.NOTES
Place additional notes here.
www.netz-weise-it.training/weisheiten/
#>
[cmdletbinding()]
param(
# The letter to start the search from - default is C or Z, if -inverse is chosen
[char]$startLetter = 'C',
# Inverse forces a backwards search through the alphabet
[switch]$inverse
)
# Legt bei inverser Suche den Startletter auf Z fest, wenn kein Startbuchstabe angegeben wurde.
If ( -not ( $PSBoundParameters.ContainsKey("Startletter") ) -and ( $inverse ) )
{ $startLetter = 'Z' }
#
[int]$Counter = ([Convert]::ToByte( $startLetter ))
if ( $inverse )
{ $Chararray = $Counter..67 }
Else { $Chararray = $Counter..90 }
foreach ( $letter in $CharArray )
{
if ( -not ( Test-Path -Path ( [Char]$letter + ':\')))
{
[char]$letter
break
}
}
}
Kommentare