gpt4 book ai didi

windows - 使用 DISKPART 删除驱动器号的 BAT/CMD 文件

转载 作者:可可西里 更新时间:2023-11-01 13:46:35 27 4
gpt4 key购买 nike

我正在尝试编写一个批处理文件来删除分配给没有文件系统的分区的驱动器号。我无法使用 wmi,因为它正在 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

这就是我目前所拥有的......

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

上面的代码不起作用,因为输出是用空格分隔的,一些空白列会扰乱解析。

另一种尝试,我认为这可行,但它可能会更好

@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

你知道为什么上面的 | 之前需要 2 ^ (管道)?

@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

上面的内容现在似乎可以正常工作了,我不得不在 echo 周围加上双引号。"%%A"然后我删除了管道前的 2 ^。

@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

以上是我的工作脚本,我添加了一些代码来验证盘符。

如果有人可以就如何改进这一点提出建议,请提出!

谢谢

最佳答案

我可能会为您提供更简单的解决方案。只需捕获整条线并使用批量子字符串拉出正确的部分

@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

for 语句生成不带列标题或分隔符的卷列表。

do 语句执行子字符串操作。

确保您拥有 diskpart 命令的管理员权限。我对您的 WinRE 环境有点好奇。我工作过的大多数都运行了最小的 WMI 实例,以及 WSH,这将使这段代码更清晰。

关于windows - 使用 DISKPART 删除驱动器号的 BAT/CMD 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32024985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com