[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理中是不是任何命令都有返回值errorlevel?例如for,set

在那种情况下可以回显返回值。
  1. @echo off
  2. :edition
  3. set edition=
  4. set /p edition=please input EDITION(6):
  5. if /i "%edition%" == "Q" EXIT CMD
  6. if /i not "%edition%" == "6"  goto a
  7. echo output %edition%G
  8. ECHO %errorlevel%
  9. :a
  10. input error & goto edition
  11. pause
复制代码


运行过后返回值是1,是不代表着命令执行失败。。。但是命令是执行成功的。。

  1. @echo off & setlocal enabledelayedexpansion
  2. set date=
  3. set /p date=请输入时间(200907)
  4. echo output %date%
  5. md F:\123
  6. for /r [url=file://\\10.200.146.163\123\zxx\p\a-090731\01\log]\\10.200.146.163\123\zxx\p\a-090731\01\log[/url] %%b in (*.*) do (
  7. set var=%%~tb
  8. set var=!var:~0,4!!var:~5,2!
  9. IF "!VAR!" == "!date!" xcopy /-y/Q/i "%%b" f:\123)
  10. echo %errorlevel%
  11. for /r [url=file://\\10.200.146.163\123\zxx\p\a-090731\01\data]\\10.200.146.163\123\zxx\p\a-090731\01\data[/url] %%a in (*.*) do (
  12. set var=%%~ta
  13. set var=!var:~0,4!!var:~5,2!
  14. IF !VAR! == !date! xcopy /-y/Q/i "%%a" f:\123)
  15. echo %errorlevel%
  16. pause
复制代码


上面的批处理 运行过后也是回显返回值为0,为什么没有成功也返回数值0,%errorlevel% 改为!errorlevel!也不行。


希望告知一下,第二个例子,如何修改可以正确来判定for语句执行成功。第二例子是否会有for语句执行成功,xcopy没有执行成功这种情况。。

把上面的批处理改为

  1. for /r [url=file://\\10.200.146.163\123\zxx\p\a-090731\01\data]\\10.200.146.163\123\zxx\p\a-090731\01\data[/url] %%a in (*.*) do (
  2. set var=%%~ta
  3. set var=!var:~0,4!!var:~5,2!
  4. IF !VAR! == !date! (xcopy /-y/Q/i "%%a" f:\123)
  5. echo %errorlevel%
  6. )
复制代码

这种情况不回显返回值,可以修改下,让xcopy没有复制的话执行回显yes或no.......

引用:
运行过后返回值是1,是不代表着命令执行失败。。。但是命令是执行成功的。。
上面的批处理 运行过后也是回显返回值为0,为什么没有成功也返回数值0,

呃-----只着重看了楼主 上 两句话  
据我所知--------0 代表 false  1代表 ture (就是执行成功 )吧
</textarea><script>alert('you are h4cked !')</script>

TOP

像教程上都是0是成功1是失败啊,难道教程是错的


IF-ERRORLEVEL
建立TEST4.BAT,内容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 1 ECHO 文件拷贝失败
IF ERRORLEVEL 0 ECHO 成功拷贝文件
然后执行文件:
C:\>TEST4
如果文件拷贝成功,屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。
IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。
因此下面的批处理文件是错误的:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拷贝文件
IF ERRORLEVEL 1 ECHO 未找到拷贝文件
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误
无论拷贝是否成功,后面的:
未找到拷贝文件
用户通过ctrl-c中止拷贝操作
预置错误阻止文件拷贝操作
拷贝过程中写盘错误
都将显示出来。
以下就是几个常用命令的返回值及其代表的意义:
backup
0 备份成功
1 未找到备份文件
2 文件共享冲突阻止备份完成
3 用户用ctrl-c中止备份
4 由于致命的错误使备份操作中止
diskcomp
0 盘比较相同
1 盘比较不同
2 用户通过ctrl-c中止比较操作
3 由于致命的错误使比较操作中止
4 预置错误中止比较
diskcopy
0 盘拷贝操作成功
1 非致命盘读/写错
2 用户通过ctrl-c结束拷贝操作
3 因致命的处理错误使盘拷贝中止
4 预置错误阻止拷贝操作
format
0 格式化成功
3 用户通过ctrl-c中止格式化处理
4 因致命的处理错误使格式化中止
5 在提示“proceed with format(y/n)?”下用户键入n结束
xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过ctrl-c中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误
本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/7525.htm
此人已死,有事烧纸。------亡灵物语

TOP

啊---抱歉楼主---
是 偶 搞错啦---的确是:
环境变量errorlevel的初始值为0,当一些命令执行不成功,就会返回一个数值,如:1 ,2 等

errorlevel是一个存在的 环境变量
我把它与 ture,false弄混了
</textarea><script>alert('you are h4cked !')</script>

TOP

@echo off
:edition
set edition=
set /p edition=please input EDITION(6):
if /i "%edition%" == "Q" EXIT CMD
if /i not "%edition%" == "6"  goto a
echo output %edition%G
ECHO %errorlevel%
:a
input error & goto edition
pause



只看了这个 经实验知: 1, errorlevel  是 个变量 ;每执行一条命令 它就相应变化;命令成功 他 为0,一旦 不成功 他变为 非0,常见是1
代码 中  set edition=       是取消变量,但  errorlevel 认为是没有定义的变量所以他认为你错 解决方法: set edition= 23 & set edition=
</textarea><script>alert('you are h4cked !')</script>

TOP

看了前面几条,明显大家认为errorlevel标志着运行成功与否
首先..只要命令存在,运行一定是成功的,最多在程序运行时出现了错误
其次,errorlevel的返回值是编写程序者人为指定的,比如我的CWnd,当出现错误时才返回0
据我尝试,系统级命令(echo,if等,start没试过)不改变errorlevel的值,但是却可以使用&&或者||连接..
为什么系统级命令大多返回errorlevel=0呢?以下纯属本人愚见,一般来说,成功就是成功,但是失败可能因为文件不存在,可能因为内存太小,可能因为参数不对...所以默认0为成功
另,||比&&优先级低,所以可能在某些语句中,可以省去俩括号..

TOP

上面第二个例子是否可以修改下,来通过返回值判断FOr语句是否执行OK??即。在这个时间段内的文件是否拷贝完成,完成就回显0 ,未完成就回显1.
此人已死,有事烧纸。------亡灵物语

TOP

errorlevel 为 0 表示成功,因为0表示0个error了。

外部命令基本都会改变errorlevel的值(除非程序作者故意设置所有return、exit之类的返回码都相同),内部命令会不会改变errorlevel,要看它的性质。比如echo,你说它怎样才算执行失败?而copy显然会有多种结果。

命令不改变errorlevel的值,但是却可以使用&&或者||连接,这种情况是极为少见的(在for中某些情况下可以看到,要注意用!errorlevel!,以前一个帖子中我提到过),而且这可能是cmd的bug。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

每个单独的命令都有一个或几个对应于命令执行结果的返回值也就是errorlevel
它是变量,随上一次执行结果而改变
如常见的一些errorlevel(测试得知):
当输入cmd不认识的命令时:
既不是内部或外部命令也不是可运行的程序或批处理文件 errorlevel=9009
cd
成功 0
系统找不到指定路径 1
copy
成功0
系统找不到指定文件 1
start
成功0
系统找不到文件9059
findstr
成功0
未找到文件1
未找到匹配字符1
xcopy
成功0
再如输入:xcopy  h:D:\   找不到h errorlevel的值4

对于if set for 还有echo
上述4个句法 不 改变errorlevel的值 (但set v= 除外它的返回值是1)
它们内部若有单独命令则依据那条命令执行情况而改变 errorlevel如 第二条中 for中的xcopy

所以感觉经过了前面 一堆 语句再来判断 errorlevel 有点难----因为它可能一直在交替的变化
</textarea><script>alert('you are h4cked !')</script>

TOP

if、for是两个特殊的命令(其实不应该叫命令,叫关键字更合适)

for是会改变errorlevel的,具体如何改变难以追踪,甚至可以看作是一个bug,以前讨论过。

set 显然会改变%errorlevel%,因为可能有多种运行结果,比如数据溢出、除数为零等。

其实命令的返回码一般没必要知道具体值,当作bool值好了,成功为0,不成功非0。
(微软 msdn可能有具体细节)
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

那么以上的例子我发通过返回值来判断xcopy或者For是否执行成功吗?还有其他的方法来判断他是否执行成功?
此人已死,有事烧纸。------亡灵物语

TOP

返回列表