Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Deployment 如何从脚本中检测已引导USB驱动器的驱动器号?_Deployment_Vbscript_Batch File_Winpe - Fatal编程技术网

Deployment 如何从脚本中检测已引导USB驱动器的驱动器号?

Deployment 如何从脚本中检测已引导USB驱动器的驱动器号?,deployment,vbscript,batch-file,winpe,Deployment,Vbscript,Batch File,Winpe,我正在从一个可引导的UFD启动WinPE 2,我需要检测驱动器号,以便告诉ImageX在哪里可以找到WIM。但是,根据我正在成像的机器,有不同的安装驱动器 我需要一种方法,使UFD始终安装在,比如,p:或其他位置。是否有一种方法可以检测启动机器的驱动器的字母,或者有另一种方法可以将WIM文件的位置传递给可从startnet.cmd访问的变量 这是另一个在TechNet有同样问题的人 这里有一个非最佳解决方案。在这种情况下,UFD必须有一个特定的名称,该名称将传递给脚本,脚本将搜索每个可能的驱动器

我正在从一个可引导的UFD启动WinPE 2,我需要检测驱动器号,以便告诉ImageX在哪里可以找到WIM。但是,根据我正在成像的机器,有不同的安装驱动器

我需要一种方法,使UFD始终安装在,比如,p:或其他位置。是否有一种方法可以检测启动机器的驱动器的字母,或者有另一种方法可以将WIM文件的位置传递给可从startnet.cmd访问的变量

这是另一个在TechNet有同样问题的人


这里有一个非最佳解决方案。在这种情况下,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

此VBScript将显示每个可移动驱动器的消息(字母:description),可以轻松修改以搜索特定驱动器并返回字母

 
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

不知道这是否有帮助。

与这里提到的其他解决方案相比,它不是一个通用的解决方案,但似乎有一种特定的方法可以确定“RAM驱动器启动”Windows PE操作系统从哪个底层卷启动。从中有关Windows PE的文档:

如果您没有启动Windows 部署服务,实现 确定Windows PE从何处启动 是先检查一下 PEBootRamdiskSourceDrive注册表项。 如果不存在,请扫描驱动器 选择正确的PEBootType并查找 某种标识 启动驱动器


(有问题的注册表值位于HKLM\SYSTEM\CurrentControlSet\Control下。)

使用此解决方案引发了另一个难题-此脚本第一次运行时,它错误地选择启动卷(X:,RAM磁盘)作为可移动磁盘。如果我再次运行脚本,它将选择正确的磁盘。这只是给未来读者的一个提示。这个解决方案现在已经很明显了。我打赌这意味着这是正确的答案。不过,要等到早上才能实施。谢谢最简单的解决方案通常是最好的,很高兴我能帮上忙。