2012-10-24 26 views
1

我正试图删除我创建的批处理文件中的某些注册表项。REG在批处理文件中删除一个包含引号的值吗?

我发现这里的下面的代码,直到它击中REG删除它做工不错

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

的值位于下[HK_CLASSES_ROOT \安装\组件\全球]
正如你可能会看到,这里的大多数值都有引号,例如:

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

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

因此,如果我回显%% a它显示值名称,因为它是在引号和一切注册表中。 但是一旦它通过REG DELETE(现在它要求确认),引号就不存在了,所以如果我点击是,它会告诉我它找不到密钥。

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

任何帮助表示赞赏,如果你需要更多的信息要求离开,我只是开始乱七八糟的批处理文件。我做了这个,因为我需要给每个我在学校工作时间自动完成所有的依赖关系的安装过程中为我校工程(计算机被幻像)

感谢

+0

我发现http://stackoverflow.com/questions/12822801/registry-value-with-quotes[/link]我没有在之前绊倒他们建议逃逸引号,我要去看看它以编程方式进行并更新我的答案。 – Rayfloyd

+0

是的 - 我刚刚测试过,并且引号必须转义为'\“' – dbenham

+0

我有这个到目前为止对于/ F”tokens = 1,*“%% a in('REG QUERY”%KEY%“^ | FINDSTR/I/C: “%VALUE%”')做( 集合b = %%一个 集b =%b: “= \” % 回声REG DELETE%KEY%/ v%的b% )'但似乎b总是空的,我认为我做错了一些事情,我现在正在努力解决这个问题 – Rayfloyd

回答

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 
) 
+0

第一个做了诀窍:)。我早些时候'setlocal enableDelayedExpansion',但我似乎没有发现任何使用我删除它哈哈。我现在就去阅读。再次感谢帮助。 – Rayfloyd

+1

@Rayfloyd - 命令行中的'HELP SET'给出了延迟扩展的一个体面的解释。 – dbenham

+0

我现在明白了,谢谢:) – Rayfloyd

相关问题