中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 对%errorlevel%的理解 上一主题 | 下一主题
rs369007
初级用户





积分 147
发帖 131
注册 2008-9-22
状态 离线
『楼 主』:  对%errorlevel%的理解

这里首先建议大家在不清楚errorlevel真实变化情况,和其值具体代表什么意思时,最好不要使用 if %errorlevel% 去判断命令是否执行成功。

下面是我写的一个判断程序是否在被内存加载c程序.
经过反复测试,我发现这个程序的return value;这个value就是cmd下全局变量errorlevel的值.
%errorlevel%的值,在批处理中有些时候使用内部命令或第三方工具,内部命令完成时可能并没设置errorlevel的值,或外部程序的返回时,并没有按要求返回,下面具体说明:

一般在批处理里面,命令执行没有出问题,成功执行,%errorlevel% 通常会被设置为 0
命令没有成功执行,%errorlevel% 值一般会被设置大于 0,如1,2等值

1,但是可能有少数一些内部命令(我目前还没发现这类命令,现在只是假设存在这类命令),并没有设置errorlevel值, 如果用%errorlevel%去判断,这类命令是否成功执行,就似乎不可行。如果你连续使用if errorlevel 判断,前一个出现错误,而后面的命令恰恰属于这类没有设置errorlevel的情况,脚本就会fall through

2,第三方工具,有时更是如此,比如第三方程序正常结束退出,我用一句 return 2;这样命令成功执行,返回值不是零而是2,%errorlevel%也是2。
同理程序非正常退出,我也可以return 0;这样完全和批处理脚本默认情况相反。

我这个程序运行时 %errorlevel%的值变化

prodetect qq.exe>nul
if %errorlevel% EQU -1  ---------表示没在内存
if %errorlevel% EQU 0  ---------表示正在运行

因此建议大家使用if %errorlevel% ... 时一定要谨慎,不要随意使用这种判断,特别是使用第三方工具时。

下载测试地址:
http://www.cn-dos.net/forum/viewthread.php?tid=50938&page=1&sid=yUXO5q###
#include<windows.h>
#include<stdio.h>
#include <tlhelp32.h>

unsigned long judge_process(char *img_name);
int help_info();

int main(int argc,char *argv[])
{
        char imagename[20]={0};
        int flag;
        if(argc!=2) return 0;
        if(0==(strcmp(argv[1],"-h")))
        {
                help_info();
                return 0;
        }
        flag=judge_process(argv[1]);
        if(flag==-1)
        {
                printf("%s 没被加载运行!",imagename);
                return -1;
        }
        else
        {
                printf("%s 已被加载运行!",imagename);
                return 0;
        }
}




unsigned long judge_process(char *img_name)
{

        HANDLE        process_snap =
        CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
               
        if(process_snap == (HANDLE)-1)
                return -1;
        PROCESSENTRY32 process_enter;        
        process_enter.dwSize = sizeof(PROCESSENTRY32);
                                                               
        if(!Process32First(process_snap,&process_enter))
                return -1;
        do {
                if(0 == strcmpi(img_name, process_enter.szExeFile))
                        return 0;
               
        }while (Process32Next(process_snap,&process_enter));
        if(NULL != process_snap)
                CloseHandle(process_snap);
        return -1;
}

int help_info()
{
        char help_info[]=
                "用法示例:\n"
                "-h   显示此信息\n"
                "prodetect qq.exe";
        puts(help_info);
        return 0;
}
[ Last edited by rs369007 on 2010-5-2 at 17:08 ]



  freedom!
2010-5-2 16:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 2 楼』:  

提供以下的链接仅供参考

批处理内部命令对错误返回码errorlevel的影响
http://www.bathome.net/thread-7479-1-1.html

set命令在.bat和.cmd中不同的errorlevel表现
http://www.cn-dos.net/forum/view ... mp;page=3#pid217157

bat与.cmd到底有何区别
http://www.bathome.net/thread-7758-1-1.html

2010-5-2 17:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
rs369007
初级用户





积分 147
发帖 131
注册 2008-9-22
状态 离线
『第 3 楼』:  

不知在c内部可不可以直接改变 errorlevel的值?

#include <stdio.h>
int main(int argc,char *argv[],char* envp[])
{
        int num=0;
        while(envp[num]!=NULL)
        {
                puts(envp[num]);
                ++num;
        }
        return 0;
}



  freedom!
2010-5-2 17:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 4 楼』:  

C或者其它语言改变errorlevel
只需要Return对应的值就可以了
不需要直接读写%errorlevel%变量
而且也无法直接读写%errorlevel%变量
因为这个变量是个动态的系统状态值
并不实际存储在变量空间
它与变量=ExitCode有关但不具有一一对应关系

另外if errorlevel 1和if %errorlevel%==1
都是判断errorlevel的一种形式
但二者无论从效果和细节都有很大差异
不能等同对待

2010-5-2 17:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: