Mit denen jonglieren ist einfacher…

Im Kummerbox-Beitrag Mit externen Festplatten jonglieren ging es neulich um die Zuweisung der Laufwerkbuchstaben. Windows nutzt für externe Laufwerke bekanntlich ein Verfahren, das aus grauer Informatik-Urzeit stammt und unflexibler nicht sein könnte. Als man ein A-Laufwerk für die Diskette, allenfalls ein B-Laufwerk für eine zweite Diskette und ein C-Laufwerk für die Festplatte nutzte, waren die Buchstaben durchaus zweckdienlich. Heute verwendet man gern auch mobile Datenträger, die nach Belieben an- und abgesteckt werden können. Diese werden vom Betriebssystem willkürlich mit Buchstaben versehen. Wenn man mit Batch-Dateien oder über Synchronisationsprogramme auf die Laufwerke zugreifen möchte (beispielsweise fürs Backup), ist es höchst störend, dass man sich nicht darauf verlassen kann, dass das gleiche Laufwerk immer den gleichen Buchstaben bekommt.

Nun haben mich im Nachgang zum Kummerbox-Beitrag einige Leute auf USB Drive Letter Manager (USBDLM) von Uwe Sieber hingewiesen. Mir ist das Programm seit längerem bekannt. Es bietet umfangreiche Möglichkeiten, Laufwerkbuchstaben anhand von Bedingungen zuzuweisen. Man kann tatsächlich Buchstaben anhand des USB-Ports zuweisen (was der Kummerbox-Fragesteller gern gehabt hätte) – allerdings ist die Vorgehensweise dafür so kompliziert, dass sie in der Zeitung nicht erklärbar gewesen wäre. Man muss erst via UsbDriveInfo die Bezeichnung des Ports in Erfahrung bringen und in der Konfigurationsdatei USBDLM.INI einen Eintrag wie z.B folgenden einfügen:

[DriveLetters10]
PortName=3-2
Letters=U,R

Einfacher wäre eine Zuweisung über die Bezeichnung des Mediums, die wie folgt erfolgen würde:

[DriveLetters20]
VolumeLabel1=Mein Stick
Letter=X

Die Zahl hinter DriveLetters ist, sofern ich das richtig begriffen habe, für die Priorisierung zuständig. Man kann Buchstaben auch nach Gerätetyp, Bus-Typ, nach Laufwerk-Grösse, der Geräte-ID, der Disk-Signatur oder anhand von Dateien auf dem Laufwerk, von aktiven Prozessen im System oder dem Computername zuweisen. Sogar die Zeit ist als Kriterium möglich: So kann man den Stick vor 8 Uhr als U und nach 8 als V mounten. Ein einleuchtender Anwendungsfall ist mir für diesen Zweck allerdings nicht eingefallen.

150217-usbdlm.png
Handarbeit an der Konfigurationsdatei ist gefragt…

Leistungsfähig, aber…

USBDLM ist für die Privatnutzung kostenlos und für berufliche Zwecke für 10 Euro zu haben. Ich wollte es nicht auf meine produktiven Systeme loslassen, und ein nichtproduktives System habe ich gerade nicht griffbereit. Das ist kein Misstrauen gegenüber USBDLM im Speziellen, sondern eine Grundsatz-Haltung. Selbst sauber programmierte System-Utilities können über zwei, drei Ecken unerwünschte Effekte haben. Kann sein, dass die jahrelang problemlos funktionieren, um dann aus heiterem Himmel mit einem Windows-Patch zu kollidieren. Auch bei neuen Betriebssystemversionen stellen solche Programme eine Gefahr dar. Denn natürlich vergisst man, sie vor dem In-Place-Upgrade zu entfernen. (Übrigens: USBDLM bietet eine Deinstallationsroutine an.) Ich bin in dieser Frage über die Jahre tatsächlich recht ideologisch geworden: Programme, die sich ins System eingraben oder irgendwie geartete inoffizielle Hacks vornehmen, installiere ich nur, wenn es nicht anders geht. Ansonsten wähle ich, der Systemstabilität zuliebe, einen Umweg. Selbst wenn er mehr Arbeit macht.

Also: Wenn es mal zu einer Buchstabenkollision kommen sollte, dann kann man die wie im Kummerbox-Beitrag beschrieben, von Hand beheben. Als Alternative habe ich auf spiceworks.com eine Batch-Datei gefunden, die die Laufwerkbuchstaben automatisch ändert. Sie verwendet Diskpart (siehe dazu auch Ein sicheres Datenversteck), um zu sehen, ob ein Laufwerk am falschen Ort zu finden ist. Falls das der Fall ist, wird es an einen neuen Ort verschoben. Das ganze ist etwas umständlich, da Batch-Dateien keinen vernünftigen Umgang mit Variablen erlauben. Darum müssen Informationen in temporäre Dateien geschrieben werden.

Warum nicht per Batch?
Ich habe das Script für meine Zwecke angepasst. (Das Original-Script von spiceworks.com findet ihr am Schluss.) Meine Modifikation bewirkt folgendes: Falls mein USB-Stick mit dem Label «Kingston» den Laufwerkbuchstaben Q nutzt, wird er auf R verschoben. Die Mühe, die Variablen wie DriveH anzupassen, habe ich mir gespart. Ich habe in Zeile 17 den Buchstaben und das Label des Kingston-Sticks eingefügt (DO @IF /I “%%b %%c” == “Q KINGSTON) und in Zeile 22 den gewünschten Laufwerksbuchstaben eingetragen (IF DEFINED DriveH echo assign letter=R:). Ansonsten war meine einzige Anpassung, unnötigen Zeilen aus dem Script zu entfernen.

@echo off
cls
title "Changing device drive letters..."
set ChangeNeeded=

echo Changing device drive letters...

:: Create a script file to be used by diskpart and then dump all volumes to a temp file
	echo list volume > %systemdrive%ListDrives.tmp
	diskpart /s %systemdrive%ListDrives.tmp > %systemdrive%CurrentDrives.tmp

:: Parse the output from 'Diskpart> list volume' for available volumes
	:: To change the following so that it works on different drive letters change the "H ____" and the set DriveH= to match the drive letter you want to move
	:: See the following samples for examples of how to change the drive you want to move

	echo   Checking drive H: for devices that need to be moved...
	FOR /F "tokens=2-4" %%a IN (%systemdrive%CurrentDrives.tmp) DO @IF /I "%%b %%c" == "Q KINGSTON" @echo   Drive %%b was found to have a %%c and will be moved... & @set DriveH=%%a

	:: In the following change the Drive_ and the letter=_: to match the drive you want to move from and to
	IF DEFINED DriveH set ChangeNeeded=1
	IF DEFINED DriveH echo select volume %DriveH% >> %systemdrive%ChangeDrive.tmp
	IF DEFINED DriveH echo assign letter=R: >> %systemdrive%ChangeDrive.tmp
	IF DEFINED DriveH set DriveH=

:: Run diskpart using the new script file, wait 15 seconds before running per a note on http://msdn.microsoft.com/en-US/library/ff794606.aspx
	if "%ChangeNeeded%" == "1" (
		echo   Changing devices to new drive letters...
		ping -n 15 localhost 1>nul 2>nul
		diskpart /s %systemdrive%ChangeDrive.tmp 1>nul 2>nul
	) else (
		echo   No devices need to be changed...
	)

:: Delete the script files
	del /q /f %systemdrive%ListDrives.tmp 1>nul 2>nul
	del /q /f %systemdrive%CurrentDrives.tmp 1>nul 2>nul
	del /q /f %systemdrive%ChangeDrive.tmp 1>nul 2>nul
	echo Done...

exit /b 0

Und hier noch das Original-Script zum Anpassen:

@echo off
cls
title "Changing device drive letters..."
set ChangeNeeded=

echo Changing device drive letters...

:: Create a script file to be used by diskpart and then dump all volumes to a temp file
	echo list volume > %systemdrive%ListDrives.tmp
	diskpart /s %systemdrive%ListDrives.tmp > %systemdrive%CurrentDrives.tmp

:: Parse the output from 'Diskpart> list volume' for available volumes
	:: To change the following so that it works on different drive letters change the "H ____" and the set DriveH= to match the drive letter you want to move
	:: See the following samples for examples of how to change the drive you want to move

	echo   Checking drive H: for devices that need to be moved...
	FOR /F "tokens=2-4" %%a IN (%systemdrive%CurrentDrives.tmp) DO @IF /I "%%b %%c" == "H Removable" @echo   Drive %%b was found to have a %%c and will be moved... & @set DriveH=%%a
	FOR /F "tokens=2-4" %%a IN (%systemdrive%CurrentDrives.tmp) DO @IF /I "%%b %%c" == "H CD-ROM" @echo   Drive %%b was found to have a %%c and will be moved... & @set DriveH=%%a
	FOR /F "tokens=2-4" %%a IN (%systemdrive%CurrentDrives.tmp) DO @IF /I "%%b %%c" == "H DVD-ROM" @echo   Drive %%b was found to have a %%c and will be moved... & @set DriveH=%%a

	echo   Checking drive G: for devices that need to be moved...
	FOR /F "tokens=2-4" %%a IN (%systemdrive%CurrentDrives.tmp) DO @IF /I "%%b %%c" == "G Removable" @echo   Drive %%b was found to have a %%c and will be moved... & @set DriveG=%%a
	FOR /F "tokens=2-4" %%a IN (%systemdrive%CurrentDrives.tmp) DO @IF /I "%%b %%c" == "G CD-ROM" @echo   Drive %%b was found to have a %%c and will be moved... & @set DriveG=%%a
	FOR /F "tokens=2-4" %%a IN (%systemdrive%CurrentDrives.tmp) DO @IF /I "%%b %%c" == "G DVD-ROM" @echo   Drive %%b was found to have a %%c and will be moved... & @set DriveG=%%a

	:: In the following change the Drive_ and the letter=_: to match the drive you want to move from and to
	IF DEFINED DriveH set ChangeNeeded=1
	IF DEFINED DriveH echo select volume %DriveH% >> %systemdrive%ChangeDrive.tmp
	IF DEFINED DriveH echo assign letter=Z: >> %systemdrive%ChangeDrive.tmp
	IF DEFINED DriveH set DriveH=

	IF DEFINED DriveG set ChangeNeeded=1
	IF DEFINED DriveG echo select volume %DriveG% >> %systemdrive%ChangeDrive.tmp
	IF DEFINED DriveG echo assign letter=Y: >> %systemdrive%ChangeDrive.tmp
	IF DEFINED DriveG set DriveG=

:: Run diskpart using the new script file, wait 15 seconds before running per a note on http://msdn.microsoft.com/en-US/library/ff794606.aspx
	if "%ChangeNeeded%" == "1" (
		echo   Changing devices to new drive letters...
		ping -n 15 localhost 1>nul 2>nul
		diskpart /s %systemdrive%ChangeDrive.tmp 1>nul 2>nul
	) else (
		echo   No devices need to be changed...
	)

:: Delete the script files
	del /q /f %systemdrive%ListDrives.tmp 1>nul 2>nul
	del /q /f %systemdrive%CurrentDrives.tmp 1>nul 2>nul
	del /q /f %systemdrive%ChangeDrive.tmp 1>nul 2>nul
	echo Done...

exit /b 0