BAT / CMD-Datei zum Entfernen von Laufwerksbuchstaben mit DISKPART

Ich versuche, eine Batch-Datei zu schreiben, um Laufwerksbuchstaben zu entfernen, die Partitionen ohne Dateisystem zugewiesen sind. Ich kann wmi nicht verwenden, da es in einer WinPE-Wiederherstellungsumgebung verwendet wird.

DISKPART> list volume

  Volume ###   Ltr  Label          Fs              Type         Size      Status     Info
  ----------   ---  -----------   -----      ----------      -------   ---------  --------
  Volume 0       K                              DVD-ROM         0 B   No Media
  Volume 1       L                              DVD-ROM         0 B   No Media
  Volume 2       C   Windows 7    NTFS        Partition        80 GB  Healthy      System
  Volume 3       D                            Partition       500 GB  Healthy      System
  Volume 4                                    Partition       500 GB  Healthy      System
  Volume 5       E                            Partition       500 GB  Healthy      System

DISKPART> exit 

For loop = 0 to 5
If Type[loop]="Partition" then
    If Ltr[loop]<>"" then
        If Fs[loop]="" then
            SELECT VOLUME loop
            REMOVE LETTER Ltr[loop]
       End If
    End If
End If
Next

Das ist was ich bisher habe ...

@echo off

For /F "Tokens=1,2,3,4,5,6*" %%I In ('echo.list volume^|diskpart.exe^|findstr /I /R /C:"Volume [0-9]"') Do (
echo %%I %%J %%K %%L %%M %%N
if "%%N"=="Partition" (
if NOT "%%K"=="" (
if "%%M"=="" (
echo mountvol %%K: /D
)
)
)
)

Das oben beschriebene Verfahren funktioniert nicht, da die Ausgabe durch Leerzeichen begrenzt ist und einige leere Spalten die Syntaxanalyse durcheinander bringen.

Ein weiterer Versuch, ich denke, das funktioniert, aber es könnte besser sein

@echo off
cd /d "%~dp0"
for /f "skip=8 tokens=*" %%A in ('echo.list volume && echo.exit^|%windir%\system32\diskpart.exe') do (
echo.%%A ^^| find /I "       Partition" >nul && (
for /f "tokens=3 delims= " %%B in ("%%A") do (echo.mountvol %%B: /D)
)
)
pause
exit

Weißt du, warum das oben genannte 2 ^ vor dem | benötigt (Pipe)?

@echo off
for /f "skip=9 tokens=*" %%A in ('echo.list volume^| diskpart') do (
echo."%%A"| find /I "       Partition" >nul && (
for /f "tokens=3 delims= " %%B in ("%%A") do (echo.mountvol %%B: /D & mountvol %%B: /D)
)
)
pause
exit

Das obige scheint jetzt zu funktionieren, ich musste das Echo in doppelte Anführungszeichen setzen. "%% A" und dann habe ich die 2 ^ vor der Pipe entfernt.

@echo off
setlocal enableDelayedExpansion
set "validDrives=;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;"
for /f "skip=9 tokens=*" %%A in ('echo.list volume^| diskpart') do (
echo."%%A"| find /I "       Partition" >nul && (
for /f "tokens=3 delims= " %%B in ("%%A") do (
if "!validDrives:;%%~B;=!" neq "!validDrives!" (echo.mountvol %%B: /D & mountvol %%B: /D)
)
)
)
pause
exit

Das obige Skript ist mein Arbeitsskript. Ich habe Code hinzugefügt, um den Laufwerksbuchstaben zu überprüfen.

Wenn irgendjemand Vorschläge machen kann, wie man das verbessern kann, dann bitte!

Vielen Dan

Antworten auf die Frage(2)

Ihre Antwort auf die Frage