¿Cómo puedo detectar la letra de unidad de una unidad USB arrancada desde un script?
-
05-09-2019 - |
Pregunta
Estoy iniciando WinPE 2 desde un UFD de arranque y necesito detectar la letra de la unidad para indicarle a ImageX dónde encontrar el WIM.Sin embargo, dependiendo de la máquina que estoy imaginando, hay diferentes unidades montadas.
Necesito una manera de montar consistentemente el UFD en, digamos, P:o algo.¿Existe alguna forma de detectar la letra de la unidad desde la que se inició la máquina u otra forma de pasar la ubicación de mi archivo WIM a una variable accesible desde startnet.cmd?
Aquí hay alguien más con el mismo problema en TechNet.
Solución
Este VBScript mostrará un mensaje para cada unidad extraíble (letra: descripción), podría modificarse fácilmente para buscar una unidad en particular y devolver la letra.
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
No sé si eso ayuda en algo.
Otros consejos
Es una solución menos genérico que los otros mencionados aquí, pero parece que hay una manera específica para determinar qué cantidad involucrada en un "RAM-drive-arrancado" OS de Windows PE se inicia desde. De la documentación en Windows PE en el Kit de instalación de windows avanzada :
Si no está arrancando de Windows Los servicios de implementación, la mejor manera de determinar dónde Windows PE arranca desde es la primera comprobación de clave de registro PEBootRamdiskSourceDrive. Si no está presente, analizar las unidades del PEBootType correcta y buscar algún tipo de archivo de etiqueta que identifica la unidad de arranque.
(El valor del registro en cuestión se encuentra en HKLM \ SYSTEM \ CurrentControlSet \ Control).
Esto es una solución no óptima. En este caso, la unidad flash USB tiene que tener un nombre específico, que se pasa a la secuencia de comandos, que busca en todas las posibles letra de unidad para un partido. Probablemente no sea práctico para confiar en las unidades flash todos con el mismo nombre.
Todavía esperando que alguien aparece por una mejor respuesta!
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