2014-11-15 1 views
1

Мне нужно выбрать диск в WinPE, используя DISKPART по метке. Я нашел это, но я думаю, что это устарело:diskpart select by disk label

@Echo %dbg%Off 
:: 
:: Find External drive and set it active 
:: Lists Disk Information using Diskpart 
:: 
SetLocal EnableDelayedExpansion 
:: Type the frst 11 characters of the label of the drive here. 
Set _FindLabel=Recovery 
Call :_InitVars "%_FindLabel%" 
"%SystemRoot%\system32\FSUTIL.exe">Nul 2>&1||Goto _NotAdmin 
Echo. 
Echo.Please wait, gathering info on the installed drives 
Echo. 
>"%_Dscr1%" Echo.List disk 
For /F "Tokens=2" %%I In ('Diskpart /S "%_Dscr1%"^|Findstr /I /R /C:"Disk [0-9]"') Do (
(Echo.Select Disk %%I 
Echo.Detail Disk)>>"%_OFile1%" 
) 
For /F "Tokens=1,2,3*" %%I In ('Diskpart /S "%_OFile1%"^|Findstr /I /R /C:"Disk    [0-9]" /C:"Volume [0-9]"') Do (
    If /I %%I==Disk (
Set _Tmp=%%J: 
) Else (
Set _Label=%%L 
Set _Label=!_Label:~,11! 
>>"%_OFile2%" Echo.!_Tmp!%%J:!_Label! 
)) 
If Exist "%_OFile1%" Del "%_OFile1%" 
For /F "Usebackq Tokens=1-3 Delims=:" %%I In ("%_OFile2%") Do (
Set _Label=%%K 
Set _Label=!_Label:~,11! 
If "!_Label!"=="%_FindLabel%" (Set _Disk=%%I) & (Set _Label=%%K) & Goto _FDisk 
>>"%_OFile1%" Echo.Volume %%J on Disk %%I has the Label %%K 
) 
Echo. 
Echo.There is no drive connected that has the label of "%_FindLabel%" 
Echo.These are the currently connected volumes: 
Type "%_OFile1%" 
:_Exit 
Echo. 
Pause 
Goto _Cleanup 
:_FDisk 
(Echo.Select disk %_Disk% 
Echo.Select Partition 1 
Echo.Active)>"%_Dscr1%" 
Diskpart /S "%_Dscr1%" 
:_Cleanup 
For %%I In ("%_Dscr1%" "%_OFile1%" "%_OFile2%") Do Del %%I>Nul 2>&1 
Goto :EOF 
:::::::::::::::::::::::::::::::::::::::::::::::::::::: 
::   Subroutines 
:::::::::::::::::::::::::::::::::::::::::::::::::::::: 
:_NotAdmin 
Ver|Findstr /I /C:"Version 5">Nul 
If %Errorlevel%==0 (Set _Tmp1=5) & (Set _Tmp=a Computer Administrator account) 
Ver|Findstr /I /C:"Version 6">Nul 
If %Errorlevel%==0 (Set _Tmp1=6) & (Set _Tmp=an Elevated Command Prompt) 
Echo. 
Echo.This program must be run from %_Tmp%. 
If %_Tmp1%==6 Echo.Please Right click the file, then click Run as Administrator 
Echo.Exiting program 
Goto _Exit 
:_InitVars 
For /F "Tokens=1 Delims==" %%I In ('Set _ 2^>Nul') Do Set %%I= 
Set _Dscr1=%temp%\dpscr1.txt 
Set _OFile1=%temp%\_OFile1.txt 
Set _OFile2=%temp%\_OFile2.txt 
Set _FindLabel=%~1 
Set _FindLabel=%_FindLabel:~,20% 
Call :_Cleanup 

Когда я бегу, он возвращает:

Please wait, gathering info on the installed drives 

There is no drive connected that has the label of "Recovery" 
These are the currently connected volumes: 
Volume 1 on Disk 0 has the Label NTFS Part 
Volume 2 on Disk 0 has the Label NTFS Part 
Volume 3 on Disk 1 has the Label WINPE 

Это показывающая Fs (файловой системы), а не ярлык.

Diskpart выход (объем списка)

Volume ### Ltr Label  Fs  Type  Size  Status  Info 
---------- --- ----------- ----- ---------- ------- --------- -------- 
Volume 0  D USBBOOT  UDF DVD-ROM  329 MB Healthy 
Volume 1   Windows  NTFS Partition  40 GB Healthy 
Volume 2   Recovery  NTFS Partition  19 GB Healthy 
Volume 3  Z WINPE  FAT32 Removable 7632 MB Healthy 

Не знаю, как изменить это, чтобы получить его, чтобы выбрать столбец Label.

ответ

1

Как там отсутствуют действительная букву диска в некоторых строках вывода Diskpart (list volume, столбец ltr), то лексемы в строке # 19

For /F "Tokens=1,2,3*" %%I In ('Diskpart /S "%_OFile1%"^|Findstr /I /R /C:"Disk [0-9]" /C:"Volume [0-9]"') Do (

дисплея следующим образом (и мы имеем нашу виновницу сейчас):

%%I %%J %%K  %%L 
Volume 0 D  USBBOOT  UDF DVD-ROM  329 MB ... 
Volume 1 Windows NTFS Partition  40 GB Healthy 
Volume 2 Recovery NTFS Partition  19 GB Healthy 
Volume 3 Z  WINPE  FAT32 Removable 7632 MB ... 

Таким образом, вы можете использовать следующий фрагмент кода, (вместо строк 19..26) в вашем скрипте:

For /F "Tokens=1*" %%I In ('Diskpart /S "%_OFile1%"^|Findstr /I /R /C:"Disk [0-9]" /C:"Volume [0-9]"') Do (
    If /I %%I==Disk (
    Set _Tmp=%%J: 
) Else (
    Set _Label=%%J 
    Set _Label=!_Label:~10,11! 
>>"%_OFile2%" Echo.!_Tmp!%%J:!_Label! 
)) 

Уход за этим изменением вмешивается _Tmp переменная!