@echo off
setlocal EnableExtensions EnableDelayedExpansion
REM ============================================================
REM FixDockDriveLetter.bat
REM Zweck:
REM - Wenn das HP USB-C Dock (meist Cardreader/Mass Storage) beim Start den Buchstaben E: "kapert",
REM setzt dieses Script den Dock-Buchstaben z.B. auf X: um und macht E: wieder frei.
REM
REM So verwendest du es:
REM 1) Variablen unten anpassen (DOCK_CURRENT_LETTER und DOCK_TARGET_LETTER)
REM 2) Als Administrator ausführen (oder per Task Scheduler "Mit höchsten Privilegien" starten)
REM
REM Hinweis:
REM - Dieses Script arbeitet bewusst "stumpf" mit dem aktuellen Buchstaben (z.B. E:).
REM Das ist in deinem Fall genau richtig, weil vor dem VPN-Mapping E: durch das Dock belegt ist.
REM ============================================================
REM =======================
REM 1) HIER ANPASSEN
REM =======================
REM Der Buchstabe, den das Dock aktuell belegt (Konflikt-Buchstabe)
set "DOCK_CURRENT_LETTER=E"
REM Der Buchstabe, den das Dock dauerhaft bekommen soll (frei wählen, z.B. X, Y, Z)
set "DOCK_TARGET_LETTER=X"
REM Optional: Log-Datei (leer lassen, wenn du kein Log willst)
set "LOGFILE=%~dp0FixDockDriveLetter.log"
REM =======================
REM 2) Admin-Check
REM =======================
net session >nul 2>&1
if not "%errorlevel%"=="0" (
echo [FEHLER] Bitte als Administrator ausfuehren.
echo Tipp: Rechtsklick auf die BAT-Datei ^> "Als Administrator ausfuehren"
exit /b 1
)
REM =======================
REM 3) Plausibilitaetschecks
REM =======================
REM Zielbuchstabe darf nicht schon belegt sein (sonst wuerde man etwas anderes ueberschreiben)
if exist "%DOCK_TARGET_LETTER%:\" (
echo [FEHLER] Zielbuchstabe %DOCK_TARGET_LETTER%: ist bereits belegt.
echo Waehle einen freien Buchstaben (z.B. X, Y oder Z).
exit /b 2
)
REM Wenn der aktuelle Buchstabe gar nicht existiert, gibt es nichts zu tun
if not exist "%DOCK_CURRENT_LETTER%:\" (
echo [INFO] %DOCK_CURRENT_LETTER%: ist aktuell nicht vorhanden. Nichts zu tun.
exit /b 0
)
REM =======================
REM 4) Diskpart-Skript erzeugen und ausfuehren
REM =======================
set "DPSCRIPT=%temp%\fix_dock_letter_%random%.txt"
REM Diskpart kann Volume direkt ueber den Laufwerksbuchstaben selektieren:
REM select volume E
REM Danach:
REM remove letter=E
REM assign letter=X
REM Das funktioniert, solange E: aktuell wirklich das Dock-Volume ist (dein Fall).
(
echo select volume %DOCK_CURRENT_LETTER%
echo remove letter=%DOCK_CURRENT_LETTER%
echo assign letter=%DOCK_TARGET_LETTER%
echo exit
) > "%DPSCRIPT%"
call :Log "[INFO] Starte Diskpart, setze %DOCK_CURRENT_LETTER%: -> %DOCK_TARGET_LETTER%:"
diskpart /s "%DPSCRIPT%" > "%temp%\diskpart_out_%random%.txt" 2>&1
set "DPERR=%errorlevel%"
type "%temp%\diskpart_out_%random%.txt" | findstr /i /c:"DiskPart successfully" >nul
set "DPSUCCESS=%errorlevel%"
del /q "%DPSCRIPT%" >nul 2>&1
if not "%DPERR%"=="0" (
call :Log "[FEHLER] Diskpart lieferte Fehlerlevel %DPERR%."
call :Log " Ausgabe (siehe auch tempor. Datei): %temp%\diskpart_out_..."
type "%temp%\diskpart_out_%random%.txt"
exit /b 3
)
REM Optionaler Erfolgstest: Zielbuchstabe muss danach existieren
if exist "%DOCK_TARGET_LETTER%:\" (
call :Log "[OK] Dock wurde auf %DOCK_TARGET_LETTER%: gelegt. %DOCK_CURRENT_LETTER%: ist frei."
del /q "%temp%\diskpart_out_%random%.txt" >nul 2>&1
exit /b 0
) else (
call :Log "[WARNUNG] Zielbuchstabe %DOCK_TARGET_LETTER%: ist danach nicht sichtbar."
call :Log " Moeglich: Das Volume war doch nicht das Dock oder Windows hat anders enumeriert."
type "%temp%\diskpart_out_%random%.txt"
exit /b 4
)
REM =======================
REM Logging-Funktion
REM =======================
:Log
set "MSG=%~1"
echo %MSG%
if not "%LOGFILE%"=="" (
echo %date% %time% %MSG%>> "%LOGFILE%"
)
exit /b 0