如何删除与带空格的字符串匹配的多个注册表值?

问题描述 投票:0回答:2

有人知道如何删除与带空格的字符串匹配的多个注册表值吗? 我找到了一个可以在没有空格的情况下执行此操作的代码,但是当值中包含空格时,我找不到任何可以执行此操作的代码。

如果值没有空格则有效。

For /f "tokens=1,*" %%k in ('Reg Query "HKLM\SOFTWARE\testkey" 2^>NUL ^| Find /i "0.3200.0"') do ECHO Reg Delete "HKLM\SOFTWARE\testkey" /v "%%k" /f

Reg查询输出:

   TestValueToRemoveWithoutSpaces,0.3200.0,es,b03f5f7f11d50a3a       REG_BINARY      F2243A58D787DA01
   Test Value To Remove With Spaces,0.3200.0,es,b03f5f7f11d50a3a       REG_BINARY      F2243A58D787DA01
windows batch-file cmd
2个回答
0
投票

使用 以管理员身份运行执行的以下批处理文件可用于二进制注册表值删除任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=*" %%G in ('%SystemRoot%\System32\reg.exe QUERY "HKLM\SOFTWARE\testkey" 2^>nul ^| %SystemRoot%\System32\find.exe /I "0.3200.0"') do (
    set "RegLine=%%G"
    setlocal EnableDelayedExpansion
    set "RegLine="!RegLine:    REG_BINARY    =" "!""
    for %%H in (!RegLine!) do if defined RegLine %SystemRoot%\System32\reg.exe DELETE "HKLM\SOFTWARE\testkey" /f /v %%H 1>nul & set "RegLine="
    endlocal
)
endlocal

FOR /F 命令行会分配由 reg.exe

 分配的每一行输出,并由 
find.exe
 过滤,并从分配给指定循环变量 
G
 的行中删除前导普通空格和水平制表符,只要注册表值名称不以分号开头。

换句话说,环境变量

RegLine

是为这两行定义的:

TestValueToRemoveWithoutSpaces,0.3200.0,es,b03f5f7f11d50a3a REG_BINARY F2243A58D787DA01 Test Value To Remove With Spaces,0.3200.0,es,b03f5f7f11d50a3a REG_BINARY F2243A58D787DA01

REG_BINARY

左右各有四个正常空格。在设置启用延迟变量扩展的新本地环境后,接下来将使用该事实。

环境变量

RegLine

 被重新定义,在开头插入 
"
 并将 
REG_BINARY
 替换为 
" "
 前后的四个空格,并在末尾再添加一个 
"
。分配给 
RegLine
 的字符串值位于此命令行之后:

"TestValueToRemoveWithoutSpaces,0.3200.0,es,b03f5f7f11d50a3a" "F2243A58D787DA01" "Test Value To Remove With Spaces,0.3200.0,es,b03f5f7f11d50a3a" "F2243A58D787DA01"

FOR循环用于处理分配给环境变量RegLine

的两个双引号字符串。

REG,用于删除其名称与周围的 "

 分配给循环变量 
H
 的值的命令,在首次执行时运行,并且仍定义环境变量 
RegLine
。然后使用 
RegLine
 删除环境变量 
set "RegLine="

第二次执行命令行时,不再定义环境变量

RegLine

,并将 
"F2243A58D787DA01"
 分配给循环变量 
H
。由于错误评估了 IF
条件,Windows 命令 REGSET 不再执行。 最后,在处理下一行之前恢复启用延迟变量扩展之前的初始环境,以避免许多要删除的注册表值出现堆栈溢出。请阅读

此答案

,了解有关命令 SETLOCALENDLOCAL 的详细信息。 要了解所使用的命令及其工作原理,请打开

命令提示符

窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

    echo /?
  • endlocal /?
  • for /?
  • if /?
  • reg /?
  • reg delete /?
  • reg query /?
  • set /?
  • setlocal /?
  • 
    
  • 另请参阅
使用 Windows 批处理文件的单行多个命令

,了解无条件命令运算符 &的说明。

阅读有关 

使用命令重定向运算符

的 Microsoft 文档,了解 2>nul

|
的说明。重定向运算符
>
|
必须在
FOR
命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行执行嵌入命令的命令 FOR 之前处理此命令行时将其解释为文字字符使用在后台启动的单独命令进程,并使用 %ComSpec% /c 启动,并且
'
中的命令行作为附加参数附加。
    


0
投票

这与

我本周早些时候的回答

非常相似。主要区别是使用 -Like 运算符,而不是使用

-Match
(这会在正则表达式模式匹配中将某些字符视为特殊字符)。
@Echo Off
SetLocal EnableExtensions

Set "RegRoot=HKLM"
Set "RegKey=\SOFTWARE\testkey"
Set "ValStr=,0.3200.0,"

For /F Delims^=^ EOL^= %%G In ('
 %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command
 "(Get-ItemProperty -Path '%RegRoot%:%RegKey%').PSObject.Properties"
 " | Where-Object Name -Like '%ValStr%' | Select-Object -ExpandProperty Name"
 2^>NUL') Do %SystemRoot%\System32\reg.exe Delete "%RegRoot%%RegKey%" /V "%%G" /F 1>NUL

请注意,为了稳健性,我冒昧地在您的值字符串中包含了已知的前导和尾随逗号。

© www.soinside.com 2019 - 2024. All rights reserved.