0

我正在尝试删除我制作的批处理文件中的一些注册表项。

我在这里找到了以下代码,它运行良好,直到它到达 REG DELETE

for /F "tokens=1,*" %%a in ('REG QUERY "%KEY%" ^| findstr /I /C:"%VALUE%"') do (REG DELETE %KEY% /v %%a)

该值位于 [HK_CLASSES_ROOT\Installer\Assemblies\Global]
正如您可能看到的那样,这里的大多数值都有引号,例如:

ADODB,fileVersion="7.10.2346.0",version="7.0.3300.00",culture="neutral",publicKeyToken="B03F5F7F11D50A3A"

这不完全是我想要删除的,但它非常接近。

因此,如果我回显 %%a 它会显示值名称,因为它在 regedit 中带有引号和所有内容。但是一旦它通过 REG DELETE(现在它要求确认)报价不存在,所以如果我点击是,它告诉我它找不到密钥。

显然它不能,因为它没有解析它最初发现的相同的东西。我一直在努力寻找解决方案,但到目前为止我还没有找到任何可以帮助我朝着正确方向前进的东西。我知道我可以在 vbs 中做同样的事情,但这是一行很长,而在 vbs 中做同样的工作会更长。

任何帮助表示赞赏,如果您需要更多信息,请询问,我刚刚开始处理批处理文件。我这样做是因为我每次在学校工作时都需要自动化我学校项目的所有依赖项的安装过程。(计算机被重影)

谢谢

4

1 回答 1

3

注意 - 您"tokens=1,*"不需要,因为您只使用第一个令牌。但这也不会引起问题

正如您在评论中发现并声明的那样,引号必须转义为\". 您可以使用环境变量搜索和替换以编程方式转义引号。由于必须在代码块中设置和扩展变量,因此必须使用延迟扩展。这是因为在解析行时会发生正常扩展,并且一次解析整个块,因此正常扩展将产生循环执行之前存在的值!。执行该行时会发生延迟扩展。

@echo off
setlocal enableDelayedExpansion

::some additional code to setup KEY and VALUE

for /F %%A in ('REG QUERY "%KEY%" ^| findstr /I /C:"%VALUE%"') do (
  set val=%%A
  REG DELETE "%KEY%" /v !val:"=\"!
)

我不知道是否可以包含!该值,但如果是,那么您必须在循环内打开和关闭延迟扩展。否则 %%A 的扩展在包含 时将被破坏!

@echo off
setlocal disableDelayedExpansion

::some additional code to setup KEY and VALUE

for /F %%A in ('REG QUERY "%KEY%" ^| findstr /I /C:"%VALUE%"') do (
  set val=%%A
  setlocal enableDelayedExpansion
  REG DELETE "%KEY%" /v !val:"=\"!
  endlocal
)
于 2012-10-24T02:05:45.767 回答