Windows 将硬盘驱动器号转换为相应的设备ID(或反之亦然)

Windows 将硬盘驱动器号转换为相应的设备ID(或反之亦然),windows,batch-file,command-line,wmi,wmic,Windows,Batch File,Command Line,Wmi,Wmic,我需要识别硬盘设备制造商ID的驱动器号(或者我也可以这样做) 用于检索制造商ID的命令: WMIC.exe DiskDrive Get /Format:List 输出示例(拆分并格式化HTML实体): 用于检索驱动器号的命令: WMIC.exe Volume Get /Format:List 示例输出: DriveLetter=C: 问题是我无法从两个输出中找到任何有用的属性来进行查询,我的意思是我不知道如何使用制造商ID来搜索每个ID的驱动器号,我看不到任何方法来识别ID的驱动器号 因此

我需要识别硬盘设备制造商ID的驱动器号(或者我也可以这样做)

用于检索制造商ID的命令:

WMIC.exe DiskDrive Get /Format:List
输出示例(拆分并格式化HTML实体):

用于检索驱动器号的命令:

WMIC.exe Volume Get /Format:List
示例输出:

DriveLetter=C:
问题是我无法从两个输出中找到任何有用的属性来进行查询,我的意思是我不知道如何使用制造商ID来搜索每个ID的驱动器号,我看不到任何方法来识别ID的驱动器号

因此,在我获得设备ID
磁盘&venu WDC\u WD10&PROD\u 02FAEX-00Z3A0
的那一刻,我需要将其转换为等效的驱动器号,即
C:
,仅此而已

我曾尝试使用
WMIC
工具,因为我不知道如何使用Windows中提供的本机命令行工具关联此信息,但对于我完成此任务来说,确实不完全必要。根据
WMI
类,我可以接受使用Windows中其他预安装工具的解决方案(可能是
BCDedit
?),或者也可以接受使用
VBScript
语言的解决方案,但对于环境环境,我不能使用任何其他语言(包括本机
PowerShell
)执行此任务,也不能使用Microsoft提供的第三方工具,如
Devcon
实用程序

我之所以需要它,是为了完成这个脚本,它应该检索并排除DriveLetter
C:
的DeviceID:

@Echo OFF & REM Mode con cols=150 lines=50

:: Exclude this drive during the process.
Set "ExcludedDrive=C:"

:: This variable should be set later,
:: Stores the device ID of the drive letter excluded above.
Set "ExcludedID="

REM ************
REM PSEUDO CODE:
REM ************
REM 
REM To get Volume Information:
REM WMIC.exe Volume Get /Format:List
REM WMIC.exe Volume Where 'DriveLetter="C:"' Get /Format:CSV
REM 
REM To get DiskDrive Information:
REM WMIC.exe DiskDrive Get /Format:List
REM 
REM :: Identify the drive letter of each DeviceID to add exclusions
REM For Each %%DriveLetter in %ExcludedDrive% do (
REM 
REM     :: Retrieve an WMIC Result
REM     Set WMIC_Query_Result=¿?
REM     Set WMIC_Query_Result_DriveLetter=¿?
REM     Set WMIC_Query_Result_DeviceID=¿?
REM 
REM     If %WMIC_Query_Result_DriveLetter% EQU %%DriveLetter (
REM         Set "ExcludedID=%WMIC_Query_Result_DeviceID%"
REM     )
REM )
REM 
REM ******************
REM END OF PSEUDO CODE
REM ******************

For /F "Tokens=* Delims=" %%a In (
    'REG.exe Query "HKLM\SYSTEM\CurrentControlSet\Enum\SCSI" ^| Find /I "Disk&"'
) Do (
    Echo "%%a" | Find /I "%ExcludedID%" || (
        For /F "Tokens=* Delims=" %%b In ('REG.exe Query "%%~a"') Do (
            Reg.exe ADD "%%b\Device Parameters\Disk" /V "UserWriteCacheSetting" /T "REG_DWORD" /D "0x00000000" /F 1>NUL
        )
    )
)

Pause&Exit

脚本中有两行

select disk 0
detail disk

帮助?

获取存储系统的硬盘驱动器的设备ID的解决方案(C:)


嗯,这对我来说是一个模糊的问题,因为一个驱动器可能包含多个分区。@Xearinox我认为不是因为分区不是驱动器,并且分区驱动器号应该指向驱动器,我正在使用驱动器的硬盘驱动器制造商ID。是的,但如果我理解,您可以尝试将驱动器号转换为驱动器ID。如果我在一个磁盘上有字母C、D、E怎么办。@Xearinox是的,但所有这些分区都将指向您知道的同一个硬盘驱动器!:P然后我设想应该能够检索分区的独立驱动器和该驱动器的设备ID(无论是否按该顺序),无论如何,我要澄清的是,每个磁盘有一个分区(加上C:中创建Windows OS的隐藏分区),并且没有RAID,谢谢你comment@Xearinox-不太快:)使用磁盘条带化和RAID技术,物理驱动器和逻辑卷之间可能存在多对多关系。单个驱动器可以包含多个分区(卷),单个卷可以分布在多个驱动器上。应该有一种在两者之间映射的方法,但是多对多的关系使事情复杂化。是的,这非常适合在WMIC中对硬盘模型进行查询,如果有人感兴趣,我已经发布了解决方案。谢谢
diskpart /s diskpart.script
select disk 0
detail disk
@Echo OFF & Setlocal EnableDelayedExpansion

(
 REM Diskpart Script to get details about the System's Hard Drive.
 Echo Select Disk=System
 Echo Detail Disk
) > "%TEMP%\Diskpart.tmp"

For /F "Tokens=*" %%# in (
    'Diskpart /S "%TEMP%\Diskpart.tmp" ^| Find /I "Disk Device"'
) Do (
    For /F "Tokens=1,2,* Delims=\ " %%a in (
        'WMIC.exe DiskDrive Where Model^="%%#" Get PNPDeviceID /Format:CSV ^| Find /I "&"'
    ) Do (
        Set "DeviceID=%%b"
        Set "DeviceID=!DeviceID:&=&!"
    )
)

Echo "!DeviceID!"

Pause&Exit /B 0