Board logo

标题: [注册表类] 注册表项名称的尾部包含有空格或者tab,脚本无法正常运行 [打印本页]

作者: 枯叶啊枯叶    时间: 2020-12-5 10:59     标题: 注册表项名称的尾部包含有空格或者tab,脚本无法正常运行

各位大佬,我的需求是要查询【HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers】里各个子项内是否存在【HTTP_ProxyPort】的键值,如果有则删除包含该键值的子项
当前遇到的问题是,子项名的尾部如果包含空格或者制表符tab,则会报错【错误: 系统找不到指定的注册表项或值。】

注册表结构如下:
【HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers】
--【HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers\CBH-aaa】
------【键值:HTTP_ProxyPort】
--【HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers\SAIS                        】
------【键值:HTTP_ProxyPort】


我的bat脚本:
  1. setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('reg query HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers') do (
  3.     for /f "tokens=2* delims= " %%b in ('reg query "%%a" /v HTTP_ProxyPort') do (
  4.         set tmpv=%%c
  5.         if /I "!tmpv!" neq nul (
  6.             reg delete "%%a" /f
  7.         )
  8.     )   
  9. )
复制代码
拜托指教,非常感谢
作者: smss    时间: 2020-12-5 11:16

  1. for /f "delims=" %%i in ('reg query HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers /v HTTP_ProxyPort /s^|findstr "HKEY"')do reg delete "%%i"
复制代码

作者: 枯叶啊枯叶    时间: 2020-12-5 11:25

回复 2# smss

多谢解答,但是经过测试,尾部带空格或者制表符的子项还是删除不了,提示【错误: 系统找不到指定的注册表项或值。】
作者: 枯叶啊枯叶    时间: 2020-12-5 11:51

本帖最后由 枯叶啊枯叶 于 2020-12-5 12:09 编辑

不知道尾部有空格这个问题能不能解决,如果技术上真的没法解决,是否可以做到,当执行脚本时报错【错误: 系统找不到指定的注册表项或值。】,则直接删除根项【HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers
或者说只要子项名称里包含空格或者制表符就删除根项【HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers
作者: 枯叶啊枯叶    时间: 2020-12-5 13:11

用||是否可以实现该需求,当我的脚本执行遇到错误,则直接执行reg delete HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers

如果可以,请问该命令是放在哪呢,我刚试了下,没成功,应该是我写的不对
作者: smss    时间: 2020-12-5 13:43

把那个包含空格或者制表符的注册表上传上来
作者: 枯叶啊枯叶    时间: 2020-12-5 14:18

回复 6# smss


已上传,如上,非常感谢。

如果尾部有空格的问题无法解决,我期望能能做个判断,在碰到执行失败的情况下,直接删除[HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\PremiumSoft\Navicat\Servers]
作者: smss    时间: 2020-12-5 14:46

空格在最后系统会自动删除 这和我们创建空格文件甲一样 路径中具有非法字符
虽然Echo reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Identity\SAIS                        " /f
可以显示空格系统依然会自动删除最后空格
系统实际执行reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Identity\SAIS”
作者: 枯叶啊枯叶    时间: 2020-12-5 14:55

回复 8# smss


    您说的对,我这边验证下来,感觉跟您说的一样,有什么解决方案吗,实在不行就曲线救国,如果遇到这种子项,我就直接把根给删除了。
作者: 枯叶啊枯叶    时间: 2020-12-5 19:30

有大佬能解决吗?
作者: Batcher    时间: 2020-12-6 17:30

回复 5# 枯叶啊枯叶


这样可以吗:
  1. for /f "delims=" %%a in ('reg query HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers') do (
  2.     for /f "tokens=2*" %%b in ('reg query "%%a" /v HTTP_ProxyPort') do (
  3.         if /i "%%c" neq "" (
  4.             reg delete /f "%%a"
  5.             if errorlevel 1 (
  6.                 reg delete /f "reg query HKEY_USERS\S-1-5-21-1686123356-269546589-3369588923-1000\SOFTWARE\ABC\EFG\Servers"
  7.             )
  8.         )
  9.     )   
  10. )
复制代码

作者: 枯叶啊枯叶    时间: 2020-12-6 19:05

  1. setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('reg query HKEY_USERS\S-1-5-21-3100330834-827329422-2494641558-1001\SOFTWARE\7-Zip\Servers') do (
  3.     for /f "tokens=2*" %%b in ('reg query "%%a" /v HTTP_ProxyPort') do (
  4.         if /i "%%c" neq "" (
  5.             reg delete "%%a" /f
  6.             if errorlevel 1 (
  7.                 reg delete  "HKEY_USERS\S-1-5-21-3100330834-827329422-2494641558-1001\SOFTWARE\7-Zip\Servers" /f
  8.             )
  9.         )
  10.     )   
  11. )
复制代码
好像发的代码运行有点问题,进行了修正,去把/f放到后面, reg delete  后面的项名称好像多了reg query,给删除了;但是好像还是不行,还是提示【 错误: 系统找不到指定的注册表项或值。】

我在本地建立的模拟注册表结构,上传如附件
作者: 枯叶啊枯叶    时间: 2020-12-6 19:06

回复 11# Batcher


    回复如下,麻烦帮忙看下还有解决办法吗
作者: Batcher    时间: 2020-12-7 10:23

回复 12# 枯叶啊枯叶
  1. @echo off
  2. for /f "delims=" %%i in ('reg query "HKEY_USERS\S-1-5-21-3100330834-827329422-2494641558-1001\Software\7-Zip\Servers" /v "HTTP_ProxyPort" /s ^| findstr "^HKEY_USERS"') do (
  3.     reg delete "HKEY_USERS\S-1-5-21-3100330834-827329422-2494641558-1001\Software\7-Zip\Servers" /f
  4. )
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2