Как я могу определить букву диска загруженного USB-накопителя с помощью скрипта?
-
05-09-2019 - |
Вопрос
Я запускаю WinPE 2 с загрузочного UFD, и мне нужно определить букву диска, чтобы сообщить ImageX, где найти WIM.Однако, в зависимости от компьютера, который я создаю, существуют разные подключенные диски.
Мне нужен способ последовательного монтирования UFD, скажем, на P:или что-то в этомроде.Есть ли способ определить букву диска, с которого был загружен компьютер, или другой способ передать местоположение моего WIM-файла в переменную, доступную из startnet.cmd?
Вот кто-то еще с такой же проблемой в TechNet.
Решение
Этот VBScript покажет сообщение для каждого съемного диска (буква: описание), которое можно легко изменить для поиска конкретного диска и возврата буквы.
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk where MediaType = 11")
For Each objDisk in colDisks
Wscript.Echo objDisk.DeviceID & objDisk.Description
Next
Не знаю, помогает ли это вообще.
Другие советы
Это менее универсальное решение, чем другие, упомянутые здесь, но, похоже, существует конкретный способ определить, с какого базового тома была загружена ОС Windows PE, загруженная с RAM-диска.Из документации по Windows PE в Расширенный установочный комплект Windows:
Если вы не загружаете Windows Службы развертывания, лучший способ определить, откуда загрузилась Windows PE - сначала проверить наличие раздела реестра PEBootRamdiskSourceDrive.Если его нет, просканируйте диски правильного типа PEBootType и найдите какой-нибудь файл с тегом, который идентифицирует загрузочный диск.
(Значение реестра, о котором идет речь, находится в разделе HKLM\SYSTEM\CurrentControlSet\Control.)
Вот неоптимальное решение.В этом случае UFD должен иметь определенное имя, которое передается скрипту, который ищет совпадение по каждой возможной букве диска.Вероятно, непрактично полагаться на то, что все флэш-накопители имеют одно и то же имя.
Все еще надеешься, что кто-нибудь придет с лучшим ответом!
setlocal
:: Initial variables
set TMPFILE=%~dp0getdrive.tmp
set driveletters=abcdefghijklmnopqrstuvwxyz
set MatchLabel_res=
for /L %%g in (2,1,25) do call :MatchLabel %%g %*
if not "%MatchLabel_res%"=="" echo %MatchLabel_res%
goto :END
:: Function to match a label with a drive letter.
::
:: The first parameter is an integer from 1..26 that needs to be
:: converted in a letter. It is easier looping on a number
:: than looping on letters.
::
:: The second parameter is the volume name passed-on to the script
:MatchLabel
:: result already found, just do nothing
:: (necessary because there is no break for for loops)
if not "%MatchLabel_res%"=="" goto :eof
:: get the proper drive letter
call set dl=%%driveletters:~%1,1%%
:: strip-off the " in the volume name to be able to add them again further
set volname=%2
set volname=%volname:"=%
:: get the volume information on that disk
vol %dl%: > "%TMPFILE%" 2>&1
:: Drive/Volume does not exist, just quit
if not "%ERRORLEVEL%"=="0" goto :eof
set found=0
for /F "usebackq tokens=3 delims=:" %%g in (`find /C /I "%volname%" "%TMPFILE%"`) do set found=%%g
:: trick to stip any whitespaces
set /A found=%found% + 0
if not "%found%"=="0" set MatchLabel_res=%dl%:
goto :eof
:END
if exist "%TMPFILE%" del "%TMPFILE%"
endlocal