Come posso rilevare la lettera di unità di un drive USB avviato dallo script?
-
05-09-2019 - |
Domanda
Sto lanciando WinPE 2 da un flash USB di avvio, e ho bisogno di rilevare la lettera di unità per raccontare ImageX dove trovare il WIM. Tuttavia, a seconda della macchina sono di imaging, ci sono diverse unità montate.
Ho bisogno di un modo per montare in modo coerente l'unità flash USB a, diciamo, P: o qualcosa del genere. C'è un modo per rilevare la lettera dell'unità da cui è stato avviato la macchina, o in un altro modo per passare il percorso del mio file WIM per un accesso variabile da startnet.cmd?
Ecco qualcun altro con lo stesso problema sopra a TechNet.
Soluzione
Questa VBScript mostrerà un messaggio per ogni unità rimovibile (lettera: descrizione)., Potrebbe essere facilmente modificato per la ricerca di una particolare unità e restituire la lettera
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
Non so se questo aiuta a tutti.
Altri suggerimenti
E 'una soluzione meno generico rispetto agli altri menzionati qui, ma sembra che vi sia un modo specifico per determinare quale volume di fondo un "RAM-drive-boot" PE OS Windows è stato avviato da. Dalla documentazione su Windows PE nella Kit di Windows Installazione avanzata :
Se non si esegue l'avvio di Windows Deployment Services, il modo migliore per determinare dove Windows PE avviato dal è di primo controllo per chiave di registro di sistema PEBootRamdiskSourceDrive. Se non è presente, la scansione delle unità della voce PEBootType appropriata e cercare una sorta di file di tag che identifica l'unità di avvio.
(Il valore di registro in questione si trova in HKLM \ SYSTEM \ CurrentControlSet \ Control.)
Ecco una soluzione non ottimale. In questo caso, l'unità flash USB deve avere un nome specifico, che viene passato allo script che cerca ogni lettera di unità possibile per una partita. Probabilmente non è pratico di fare affidamento sulle unità flash aventi tutti lo stesso nome.
Ancora sperando che qualcuno si apre con con una risposta migliore!
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