2015-08-15 116 views
3

我正在嘗試編寫一個批處理文件來刪除分配給沒有文件系統的分區的驅動器號。我無法使用wmi,因爲它在WinPE恢復環境中使用。使用DISKPART刪除驅動器號的BAT/CMD文件

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 

似乎是現在的工作,我不得不把周圍的回聲雙引號。「%% 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 

以上是我的工作腳本,我添加了一些代碼來驗證驅動器號。

如果有人可以提供有關如何改善這個問題的建議,那麼請做!

謝謝

+0

他從來沒有說過。他遵循堆棧溢出的規則。 – Jahwi

+0

您是否使用NTFS以外的其他文件系統?如果只使用NTFS,它將簡化腳本。 – foxidrive

回答

1

我可能有一個更簡單的解決方案給你。只要抓住了整條生產線,並使用批處理子串拉出右件

@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,這將使這個代碼更清潔。

相關問題