将reg查询输出作为一行处理

时间:2018-12-28 14:57:05

标签: batch-file registry

我想以单行(每个键一个)的格式从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#,但这似乎有些过分。

2 个答案:

答案 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 PathData的每一行合并。最简单的方法(据我所知)是获取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