我有一个批处理通过并删除注册表项。到目前为止,除了其中一个人之外,其他所有人都已成功使用CMD。
假设我们有以下密钥:
HKCU\Temp
此键具有REG_MULTI_SZ值,其名称未知。我们知道该值所在的键,并且我们知道存储在值中的数据,但不知道值的名称。不允许删除整个键(或键中的所有值):我们只想删除包含我们正在查找的数据的值。
例如,假设我们知道密钥是HKCU \ Temp,并且该值包含三个字符串:
This is a test
for
now at least
我尝试了几种不同的方法来使用CMD删除此注册表项,但我在某个地方搞定。我会输入什么命令删除这个人?
警告:我们不能假设此键上没有其他条目在第一行上具有相同的内容。它必须完全匹配。
重要评论已提升:“ reg delete 只能删除具有明确指定名称的键和值,而无法搜索数据。” -wOxxOm
因此,您必须在数据中搜索匹配项,然后删除匹配的键/值。
答案 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"
过滤它,解析结果并删除值。
简单方法:取第一个以空格分隔的标记,仅适用于没有空格的值名称
@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
更强大的方法,也可以删除带空格的变量名:
@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