unidades particiones particion montar externo eliminar duro diskpart disco desmontar comandos windows batch-file cmd

windows - particiones - Archivo BAT/CMD para eliminar letras de unidad con DISKPART



montar disco cmd (1)

Es posible que tenga una solución mucho más simple para ti. Simplemente tome la línea completa y use subcadenas por lotes para extraer las piezas correctas

@echo off setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION for /f "delims=" %%i in (''^ echo list volume ^|^ diskpart ^|^ findstr Volume ^|^ findstr /v ^ /c:"Volume ### Ltr Label Fs Type Size Status Info"^ '') do ( set "line=%%i" set letter=!line:~15,1! set fs=!line:~32,7! if not " "=="!fs!" ( if not " "=="!letter!" ( call :removeVol !letter! ) ) ) endlocal exit /b :removeVol ( echo select volume %1 echo remove letter %1 ) | diskpart exit /b

La sentencia for produce una lista de volúmenes sin los encabezados o separadores de columna.

La instrucción do hace las operaciones de subcadena.

Asegúrese de tener privilegios de administrador para el comando diskpart. Estoy un poco curioso acerca de su entorno WinRE. La mayoría de los que he trabajado tenían una instancia mínima de WMI en ejecución, así como también WSH, lo que haría que este código fuera mucho más limpio.

Intento escribir un archivo por lotes para eliminar las letras de unidad asignadas a las particiones sin sistema de archivos. No puedo usar wmi ya que se está utilizando en un entorno de recuperación de WinPE.

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

Esto es lo que tengo hasta ahora ...

@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 ) ) ) )

Lo anterior no funciona porque el resultado está delimitado por espacios y algunas columnas en blanco desordenan el análisis sintáctico.

Otro intento, creo que esto funciona, pero podría ser mejor

@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

¿Sabes por qué lo anterior necesita 2 ^ antes de | (pipa)?

@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

Lo anterior parece estar funcionando ahora, tuve que poner comillas dobles alrededor del eco. "%% A" y luego eliminé los 2 ^ antes de la tubería.

@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

Lo anterior es mi script de trabajo, agregué un código para validar la letra de la unidad.

Si alguien puede ofrecer sugerencias sobre cómo mejorar esto, ¡por favor hazlo!

Gracias