如何使用CMD通过位置和数据删除REG_MULTI_SZ

时间:2015-10-06 20:52:13

标签: windows batch-file cmd registry

我有一个批处理通过并删除注册表项。到目前为止,除了其中一个人之外,其他所有人都已成功使用CMD。

假设我们有以下密钥:

HKCU\Temp

此键具有REG_MULTI_SZ值,其名称未知。我们知道该值所在的键,并且我们知道存储在值中的数据,但不知道值的名称。不允许删除整个键(或键中的所有值):我们只想删除包含我们正在查找的数据的值。

例如,假设我们知道密钥是HKCU \ Temp,并且该值包含三个字符串:

This is a test
for
now at least

我尝试了几种不同的方法来使用CMD删除此注册表项,但我在某个地方搞定。我会输入什么命令删除这个人?

警告:我们不能假设此键上没有其他条目在第一行上具有相同的内容。它必须完全匹配。

重要评论已提升: reg delete 只能删除具有明确指定名称的键和值,而无法搜索数据。” -wOxxOm

因此,您必须在数据中搜索匹配项,然后删除匹配的键/值。

1 个答案:

答案 0 :(得分:2)

要搜索多行字符串,请使用\0分隔符和/e进行精确匹配,输出结果为:

HKEY_CURRENT_USER\Temp
    abc    REG_MULTI_SZ    This is a test\0for\0now at least

End of search: 1 match(es) found.

让我们按"REG_MULTI_SZ"过滤它,解析结果并删除值。

  1. 简单方法:取第一个以空格分隔的标记,仅适用于没有空格的值名称

    @echo off
    for /f "tokens=1,2*" %%a in ('
        reg query "HKCU\Temp" /d /e /f "This is a test\0for\0now at least"
        ^| find "REG_MULTI_SZ"
    ') do (
        echo Deleting %%a=%%c
        reg delete "HKCU\Temp" /v %%a /f
    )
    pause
    
  2. 更强大的方法,也可以删除带空格的变量名:

    @echo off
    for /f "tokens=*" %%a in ('
        reg query "HKCU\Temp" /d /e /f "This is a test\0for\0now at least"
        ^| find "REG_MULTI_SZ"
    ') do (
        setlocal enableDelayedExpansion
    
        rem Split
        set "line=%%a"
        set "value=!line:*REG_MULTI_SZ=REG_MULTI_SZ!"
        call set "name=%%line:!value!=%%"
    
        rem Trim spaces
        for /L %%b in (1,1,10) do if "!name:~-1!"==" " set "name=!name:~0,-1!"
    
        echo Deleting !name!
        reg delete "HKCU\Temp" /v "!name!" /f
    
        endlocal
    )
    pause