. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』 » 专题:命令正则

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 关闭主题
 
主题工具
wgf4242
 
wgf4242 的头像
热心会员
 
资 料:
注册日期: Aug 2001
帖子: 6,887 声望值: 6
精华: 0,解答: 40
#1 旧 2009-11-21, 14:44:31 默认 【已解决】【求助】批处理怎样查询reg query 返回的errorlevel?
wgf4242 当前离线  

如题.......
虽然有一般是成功0.不成功1.其他就不知道了...哪里查询?

我想查询键值是否存在.

键值不存在时
代码:
set regadd=reg add "HKEY_LOCAL_MACHINE\xxx\
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path') do (
if ERRORLEVEL 0
%regadd%" /v Path /d "%%i;G:\bin" /f
)
就会失败

如果是
reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path
if %errorlevel%==0 (
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path') do %regadd%" /v Path /d "%%i;G:\bin" /f
)
倒是能成功.但是下面这个方法查了2遍呢.


我就想按第一种那么写.或者大家给推荐个更好的写法.
如果有直接判断键值存在的方法就更好了.3Q
【已解决】见15楼

此帖于 2009-11-25 23:13:32 被 wgf4242 编辑. .
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,393 声望值: 3
精华: 21,解答: 84
#2 旧 2009-11-21, 22:32:48 默认
namejm 当前离线  

代码:
set regadd=reg add "HKEY_LOCAL_MACHINE\xxx\
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path 2^>nul') do (
%regadd%" /v Path /d "%%i;G:\bin" /f
)
  当括号中的reg query 命令查询不到键值的话,2^>nul 会把所有的错误提示信息屏蔽掉,从而导致第一个括号里没有任何元素,后面括号里的命令就不会执行。


TotalCommder、EveryThing、batch、AutoHotKey、EverEdit
精通Word、Excel、PPT的安装与卸载
熟练掌握VB、C++、SQL的拼读与缩写
wgf4242
 
wgf4242 的头像
热心会员
 
资 料:
注册日期: Aug 2001
帖子: 6,887 声望值: 6
精华: 0,解答: 40
#3 旧 2009-11-22, 06:47:22 默认
wgf4242 当前离线  

3Q...那我想通过它出错来执行echo XXX.怎么写?
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,393 声望值: 3
精华: 21,解答: 84
#4 旧 2009-11-23, 00:12:09 默认
namejm 当前离线  

&&:前面的语句执行成功时执行它之后后语句
||:前面的语句执行失败时执行它之后的语句

演示代码:
代码:
@echo off
reg query "HKEY_LOCAL_MACHINE\xxx\&&echo 执行成功||echo 执行失败
pause
wgf4242
 
wgf4242 的头像
热心会员
 
资 料:
注册日期: Aug 2001
帖子: 6,887 声望值: 6
精华: 0,解答: 40
#5 旧 2009-11-23, 06:20:46 默认
wgf4242 当前离线  

键值不存在时不行.

G:\TDDOWNLOAD>reg query "HKEY_LOCAL_MACHINE\xxx\ &&echo 执行成功||echo 执行失败
ERROR: The system was unable to find the specified registry key or value.
cat
 
cat 的头像
终极会员
 
资 料:
注册日期: Feb 2000
帖子: 8,365 声望值: 3
精华: 3,解答: 13
#6 旧 2009-11-23, 10:10:20 默认
cat 当前离线  

不行就改用VBS吧。批处理的办法好象必须查询两次。第一次先查询是否存在键值,第二次查询才能获取键值。

此帖于 2009-11-23 10:14:37 被 cat 编辑. .


一小撮 别有用心 煽动 不明真相 打砸抢 劝阻说服 保持理智 安定团结 纷纷表示
据当地法律法规和政策,部分签名未予显示
wgf4242
 
wgf4242 的头像
热心会员
 
资 料:
注册日期: Aug 2001
帖子: 6,887 声望值: 6
精华: 0,解答: 40
#7 旧 2009-11-23, 12:17:52 默认
wgf4242 当前离线  

不会vbs....

那我就2次查询吧...~~~~~
asap
 
asap 的头像
核心会员
 
资 料:
注册日期: Mar 2000
帖子: 2,969 声望值: 4
精华: 1,解答: 29
#8 旧 2009-11-23, 12:57:30 默认
asap 当前离线  

引用:
作者: wgf4242 查看帖子
不会vbs....

那我就2次查询吧...~~~~~
不用查询2次啊~,看你的要求,就是先查询键值Path是否存在,如果不存在就添加。如果是这样,顶楼你自己的方案,结合楼上namejm的提示,稍加修改即可:


set regadd=reg add "HKEY_LOCAL_MACHINE\xxx\
reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path 2>nul
if not %ERRORLEVEL%==0 (
%regadd%" /v Path /d "%%i;G:\bin" /f
)


也可以反过来考虑,reg query ...... | find /i "ERROR:" 2>nul 如果查到,就是说查询失败,于是就是可以执行 for /f "......" in () do (,,,,,)里面的语句了。不过这个问题应该不需要用到for语句的。


We see what we want to see. We hear what we want to hear. We believe what we want to believe.
wgf4242
 
wgf4242 的头像
热心会员
 
资 料:
注册日期: Aug 2001
帖子: 6,887 声望值: 6
精华: 0,解答: 40
#9 旧 2009-11-23, 13:17:37 默认
wgf4242 当前离线  

回楼上:
set regadd=reg add "HKEY_LOCAL_MACHINE\xxx\
reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path 2>nul
if not %ERRORLEVEL%==0 (
%regadd%" /v Path /d "%%i;G:\bin" /f
)
这里...%%i....没定义吧....

如果存在(这就查询并判断了一次)...则:
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path') do %regadd%" /v Path /d "%%i;G:\bin" /f(这语句里又查询了一次,所以就两次了)
asap
 
asap 的头像
核心会员
 
资 料:
注册日期: Mar 2000
帖子: 2,969 声望值: 4
精华: 1,解答: 29
#10 旧 2009-11-23, 13:34:29 默认
asap 当前离线  

引用:
作者: wgf4242 查看帖子
回楼上et regadd=reg add "HKEY_LOCAL_MACHINE\xxx\reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path 2>nulif not %ERRORLEVEL%==0 (%regadd%" /v Path......
%%i是没有定义(我直接抄了上面的代码)。如果查询到,那个%%i应该是怎样的,可不可以直接替换%%i的内容,然后使用上面的修改?
asap
 
asap 的头像
核心会员
 
资 料:
注册日期: Mar 2000
帖子: 2,969 声望值: 4
精华: 1,解答: 29
#11 旧 2009-11-23, 14:41:11 默认
asap 当前离线  

引用:
作者: wgf4242 查看帖子
键值不存在时不行.G:\TDDOWNLOAD>reg query "HKEY_LOCAL_MACHINE\xxx\ &&echo 执行成功||echo 执行失败ERROR: The system was unable to find the specified registry key ......
修改成这样:

G:\TDDOWNLOAD>reg query "HKEY_LOCAL_MACHINE\xxx\ 1,2>nul &&echo 执行成功||echo 执行失败



又看了看你顶楼的帖子,发现还是无法理解。
你的第1个方法,是:
引用:
作者: wgf4242
if ERRORLEVEL 0
%regadd%" /v Path /d "%%i;G:\bin" /f
虽然会失败,但看来是,当前面的reg query查询成功后,才regadd的;
而第2个方法:
引用:
作者: wgf4242
if %errorlevel%==1 (
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path') do %regadd%" /v Path /d "%%i;G:\bin" /f
)
则又是失败后,才添加;而且有意思的是,如果前面的reg query失败,后面这个应该执行不了,更不要说%%i也是没有赋值的了。。。。

而后面:
引用:
作者: wgf4242
如果存在(这就查询并判断了一次)...则:
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path') do %regadd%" /v Path /d "%%i;G:\bin" /f(这语句里又查询了一次,所以就两次了)
则又说,是存在了,再添加。。。。。。

没看明白。
wgf4242
 
wgf4242 的头像
热心会员
 
资 料:
注册日期: Aug 2001
帖子: 6,887 声望值: 6
精华: 0,解答: 40
#12 旧 2009-11-23, 17:32:51 默认
wgf4242 当前离线  

上面那个第二个粘贴错了- -...不好意思哈.刚过来了.

目的:如果存在键值则追加数据,否则直接添加数据

reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path (查询一次)
if %errorlevel%==0 ( //如果存在
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path' //又查询一次来获取值,到此查询了2次 ) do %regadd%" /v Path /d "%%i;G:\bin" /f
) else (
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path') do %regadd%" /v Path /d "G:\bin" /f
) ///////这个太长.不太简洁..


-----------------------------------------------------------------------------------
我的意思是想
直接用for..在do里判断....
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path') do ( //查询一次判断
if ERRORLEVEL 0 (
%regadd%" /v Path /d "%%i;G:\bin" /f
) else (
%regadd%" /v Path /d "G:\bin" /f
)
)


当然了,我只是在学习批处理时尝试简洁..如果实在不行换个方式(用查询2次的方法)达到目的就可以了...

此帖于 2009-11-23 18:50:24 被 wgf4242 编辑. .
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,393 声望值: 3
精华: 21,解答: 84
#13 旧 2009-11-23, 20:32:05 默认
namejm 当前离线  

4楼的代码少打了个后引号,导致执行失败,修正后的演示代码应该是这样的:
代码:
reg query "HKEY_LOCAL_MACHINE\xxx\" 2>nul &&echo 执行成功||echo 执行失败
cat
 
cat 的头像
终极会员
 
资 料:
注册日期: Feb 2000
帖子: 8,365 声望值: 3
精华: 3,解答: 13
#14 旧 2009-11-23, 21:03:30 默认
cat 当前离线  

引用:
作者: namejm 查看帖子
4楼的代码少打了个后引号,导致执行失败,修正后的演示代码应该是这样的:
代码:
reg query "HKEY_LOCAL_MACHINE\xxx\" 2>nul &&echo 执行成功||echo 执行失败
这样的话,没办法把查询成功后的值赋给某个参数以供后面使用。
asap
 
asap 的头像
核心会员
 
资 料:
注册日期: Mar 2000
帖子: 2,969 声望值: 4
精华: 1,解答: 29
#15 旧 2009-11-24, 03:55:33 默认
asap 当前离线  

引用:
作者: wgf4242 查看帖子
上面那个第二个粘贴错了- -...不好意思哈.刚过来了.目的:如果存在键值则追加数据,否则直接添加数据

reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path (查询一次)
if %errorlevel%==0 ( //如果存在
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path' //又查询一次来获取值,到此查询了2次 ) do %regadd%" /v Path /d "%%i;G:\bin" /f
) else (
for /f "tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\xxx\" /v Path') do %regadd%" /v Path /d "G:\bin" /f
) ///////这个太长.不太简洁..
如果注册表中Path不存在,那么后面那个for无论如何是无法成功运行的,即使你如后面的那样,把for单独出来。

现在知道了你的意图,可以试试下面这个代码:

@echo off & setlocal enabledelayedexpansion
set regvalue=G:\bin
set regpath=HKLM\Software\xxx /v Path
(for /f "tokens=2* delims= " %%a in ('reg query %regpath% 2^>nul') do (
if not %%a=="" set regvalue="%%b; %regvalue%"
echo reg add %regpath% /t REG_SZ /d !regvalue! /f) ) || (
reg add %regpath% /t REG_SZ /d !regvalue! /f
)
endlocal & @echo on


几个说明:
1. 我用了regpath,没有用你原来的regadd,后面可以少写一点点。
2. HKEY_LOCAL_MACHINE,在reg 命令中可以简写成HKLM,又可以少写一点。
3. 直接查询,成功了是添加;如果查询失败,则直接添加;逻辑上,就是一下reg query,一次reg add。
4. 你原来的for语句,可能没有考虑如果Path内容含有空格的情况,比如:Path=c:\program files, 你的方法,%%i只能得到c:\program, 所以我修改了一下。
5. 即使成功reg query后,可能的一个情况是Path的键存在,但值为空。即你的%%i="",因此要再判断一下。严格地讲,也许还有判断一下那个path的值是否合法,比如if exist %%i, .....
6. HKLM\xxx如果后面的xxx是HKLM下的一级目录的话,怕是无法直接建立,权限问题,但愿不是杞人忧天了。
7. reg add之后,也应该有错误检查的。
8. 通过errorlevel的错误判断,要小心,有时不可靠的。
9. 查询两次有的时候,可能反而是可好习惯。不少Windows API,都是先查询一下,返回需要的字符串长度,然后再调用。一个道理啊~。

请备份注册表,测试后,再运行该批处理!!!
发表新主题 关闭主题

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 06:47:50.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号