我想以单行(每个键一个)的格式从Windows注册表中获取一些详细信息。但是到目前为止,我一直在尝试提供我想要的详细信息,但是将其分成2/3行,这使得后期处理更加困难。
这是在Windows 10上。
一种选择是查询注册表,因此我运行以下命令:
reg query hklm\system\currentcontrolset\enum /s /f "DeviceDesc"
这使我以以下格式(片段)输出:
HKEY_LOCAL_MACHINE\system\currentcontrolset\enum\HID\VID_1A2C&PID_2124&MI_01&Col02\7&2a45f711&0&0001
DeviceDesc REG_SZ @input.inf,%hid_device_system_control%;HID-compliant system controller
HKEY_LOCAL_MACHINE\system\currentcontrolset\enum\HID\VID_1A2C&PID_2124&MI_01&Col02\8&9a82e8&0&0001
DeviceDesc REG_SZ @input.inf,%hid_device_system_control%;HID-compliant system controller
HKEY_LOCAL_MACHINE\system\currentcontrolset\enum\HID\VID_2149&PID_2117&MI_00\7&1e3fba77&0&0000
DeviceDesc REG_SZ @input.inf,%hid_device_touch_screen%;HID-compliant touch screen
HKEY_LOCAL_MACHINE\system\currentcontrolset\enum\HID\VID_2149&PID_2117&MI_01\7&316fd6b5&0&0000
DeviceDesc REG_SZ @input.inf,%hid_device_vendor_defined_range%;HID-compliant vendor-defined device
HKEY_LOCAL_MACHINE\system\currentcontrolset\enum\HID\VID_24AE&PID_2003&MI_00\8&456ad84&0&0000
DeviceDesc REG_SZ @keyboard.inf,%hid.keyboarddevice%;HID Keyboard Device
格式为:
BLANK LINE
HKEY_LOCAL.....
DeviceDesc .....
我想要的是HKEY_LOCAL...
和DeviceDesc
出现在输出文本的同一行上,以便我可以使用FIND/FINDSTR
来获取我感兴趣的设备的完整信息内。
按原样输出,我无法使用DOS命令将这两条信息汇总在一起。
有没有一种方法可以使DeviceDesc出现在同一行?
我可以为此编写Java / C#,但这似乎有些过分。
答案 0 :(得分:1)
命令 REG 没有用于定义输出格式的选项。
FOR 循环可用于连接注册表项和设备描述字符串值,以在一行上输出。接下来,可以使用命令 FINDSTR 过滤 FOR 循环的整个输出,以获取感兴趣的设备描述:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
(for /F "tokens=1,2*" %%A in ('%SystemRoot%\System32\reg.exe query HKLM\System\CurrentControlSet\enum /s /f "DeviceDesc"') do if /I not "%%A" == "DeviceDesc" (set "RegKey=%%A") else echo !RegKey! %%C) | %SystemRoot%\System32\findstr.exe /I /L /C:"HID-compliant touch screen"
endlocal
请注意,由于启用了延迟的环境变量扩展,因此此批处理代码无法正确处理包含一个或多个!
的注册表项或描述值。
有四个空格用于将注册表项与设备描述分开。当然也可以使用例如水平制表符。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
echo /?
endlocal /?
findstr /?
reg /?
reg query /?
set /?
setlocal /?
答案 1 :(得分:1)
据我了解,您希望将Key Path
和Data
的每一行合并。最简单的方法(据我所知)是获取FOR
循环的每个结果,并使用IF
语句设置稍后将组合的字符串。
下面您将找到该脚本-就我而言,我只是将结果输出到文档中。很好,可以稍后在TYPE
内使用FOR
语句来调用。 但是,如果您想在循环中对这些变量进行操作,只需在ECHO [!Location! !Data!] >> Output.txt
处继续执行代码即可。
@ECHO OFF
@setlocal EnableDelayedExpansion
Set "RUN=0"
for /F "tokens=*" %%A in ('reg query hklm\system\currentcontrolset\enum /s /f "DeviceDesc"') DO (
Rem | Grab & organize output variables to string.
If "!RUN!"=="1" (
Rem | Second Cycle
Set "Data=%%A"
ECHO !Location! !Data! >> Output.txt
Rem | Restart Cycle
Set "Data="
Set "Location="
Set "RUN=0"
) ELSE (
Rem | First Cycle
Set "Location=%%A"
Set "RUN=1"
)
)
Goto :EOF