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