Board logo

标题: [已解决]如何判断注册表特定位置是否存在特定键值 [打印本页]

作者: renol     时间: 2009-12-30 11:11    标题: [已解决]如何判断注册表特定位置是否存在特定键值

自己写了个批处理,针对某个软件进行设置
需要先判断该机器是否安装了这个软件
是的话继续操作,不是的话提示该机未装软件,不需要运行此批处理


以QQ为例
可以根据注册表中
HKLM\SOFTWARE\TENCENT\QQ 下的
Install键值获取QQ的安装目录
现在需要判断 Install 键是否存在,存在则 goto task,不存在则 goto :eof
另想问问,如果存在,且值非空,则goto task ,为空则 goto :eof

知识有限,还请大家帮忙 :)

  Quote:
@echo off
for /f "tokens=2,*" %%i in ('reg query "HKLM\SOFTWARE\TENCENT\QQ" /v "Install"') do (
set QQ=%%j
)
echo 本机QQ目录位于 %QQ%
pause

参照本论坛其他朋友关于 收藏夹 的解决方法修改的

[ Last edited by renol on 2010-1-5 at 14:38 ]
作者: renol     时间: 2010-1-5 11:45
修改了一下标题,希望不会误导热心的朋友
顶起来看看
作者: renol     时间: 2010-1-5 12:58
参考lxmxn在其他朋友的帖子中贴出的解决办法,以及忘记某位仁兄的找到收藏夹的所在位置的方法,结合了一下
凑合解决了自己的问题:

  Quote:
@ECHO OFF
reg export "HKLM\SOFTWARE\TENCENT\QQ" QQ.reg /nt4>nul
findstr /i "Install" QQ.reg >nul && goto right || goto wrong

:wrong
echo.
echo 这台机器没有安装QQ
echo.
pause>nul
goto :eof

:right
for /f "tokens=2,*" %%i in ('reg query "HKLM\SOFTWARE\TENCENT\QQ" /v "Install"') do (
set QQdir=%%j
)
echo.
echo QQ路径为:%QQdir%
pause>nul
goto :eof

不过有个麻烦,参数/nt4 的作用
在XP下,有这个参数才能成功执行命令,才能判断正确
Windows 2003 不支持reg export 的参数 /nt4 ,始终无法判断正确

避免使用参数 /nt4

  Quote:
@echo off &setlocal enabledelayedexpansion
for /f "tokens=1,2,*" %%i in ('reg query "HKLM\SOFTWARE\TENCENT\QQ" ^| find /i "Install"') do ( goto right)

:wrong
echo.
echo 这台机器没有安装QQ
pause>nul
goto :eof

:right
for /f "tokens=2,*" %%i in ('reg query "HKLM\SOFTWARE\TENCENT\QQ" /v "Install"') do (
set QQdir=%%j
)
echo.
echo QQ路径为:%QQdir%
pause>nul
goto :eof

[ Last edited by renol on 2010-1-5 at 14:15 ]
作者: qinchun36     时间: 2010-1-5 13:32
那就用最笨的方法嘛:

第一步:执行查询,如果不存在的话会出错,根据 errorlevel 就能判断了撒;

第二步:如果没报错就再执行一次,取出那个值看看是不是空的;

第三步:如果不是空的再跳到 task。
@echo off
::要执行的注册表查询命令
set REG_QUERY_COMMAND=reg query "HKLM\SOFTWARE\TENCENT\QQ" /v "Install"

%REG_QUERY_COMMAND% 1>nul 2>&1
if errorlevel 1 (
  echo 本机没有安装 QQ2008 及更低版本
  goto eof
) else (
  setlocal enabledelayedexpansion
  set "ching="
  ::根据 reg query 命令输出的特殊格式,才能知道哪个部分是显示数据的,并据此判断
  for /f "tokens=2,*" %%i in ('%REG_QUERY_COMMAND%') do (
    set "ching=%%j"
  )
  if "!ching!"=="" (
    echo 查询的值为空。
    goto eof
  ) else (
    goto task
  )
  endlocal
)

:task
for /f "tokens=2,*" %%i in ('%REG_QUERY_COMMAND%') do (
  set QQ=%%j
)
echo 本机QQ目录位于 %QQ%

:eof
echo.
echo ===我是华丽的 KOF ===
pause>nul
exit

作者: renol     时间: 2010-1-5 14:33
很感谢4楼 qinchun36 的解决方法
我之前也看到有人用errorlevel来判断,自己尝试用它实现判断,但是总是失败
你的方法很好,也能实现判断,这里我学习了!!

不仅判断了是否存在,还判断了是否空值,很好很好 :)

呵呵,看来我不着急解决问题的时候,要多找点时间系统的学学基础知识啊!!

[ Last edited by renol on 2010-1-5 at 14:34 ]