资源描述
矿井通风网络论程序作业
学 院: 矿业学院 专 业: 安全工程
姓 名: 雷斌 学 号: 1208010028
年 级: 2012 级 任课教师: 袁梅
2015年5 月 6 日
这是个5,7图,以树T={e2,e4,e6,e7}在前余树弦在后的顺序,求B1,Cf , Sf
下面是我所写程序,(是用C语言写的)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
int m,n;
double **a,**b11,**b12,**zb11,**zb12,**nzb12,**c12,*C,*AA,*B,**sf,**s11,**cf,**B1;
double *Q,*Z;
void Create_Omr(int m,int n);//创建原始矩阵变量函数
void Free_mr();
int brinv(double *a,int n);
void brmul(double a[], double b[],int m,int n,int k,double c[]);
void main()
{int i,j,M,k;
int t=0;
printf("输入m ");
scanf("%d",&m);
printf("输入n ");
scanf("%d",&n);
M=m-1;
Create_Omr(m,n);//调用创建动态数组函数
printf("输入起点Q[n]");
for (i=0;i<n;i++)
scanf("%lf",&Q[i]);
printf("输入终点Z[n]");
for (i=0;i<n;i++)
scanf("%lf",&Z[i]);
printf("<开始计算各个矩阵>\n");
for (i=0;i<m;i++)
for (j=0;j<n;j++)
a[i][j]=0.0;//初始化a的值 全部置0
for(j=0;j<n;j++) //求关联矩阵的过程
{ i=(int)Q[j]-1;
a[i][j]=1;
}
for(j=0;j<n;j++)
{ i=(int)Z[j]-1;
a[i][j]=-1;
}
printf("输出关联矩阵B\n");
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
printf("%3d",(int)a[i][j]);
printf("\n");
}
printf("输入基本关联矩阵B");
scanf("%d",&k);
for(i=0;i<m-1;i++)/////求基本关联矩阵Bk
{
if(i==(k-1))
{ for(j=0;j<n;j++)
B1[i][j]=a[k][j];
t++;
}
else
for(j=0;j<n;j++)
B1[i][j]=a[i+t][j];
}
printf("输出基本关联矩阵B%d\n",k);
for(i=0;i<m-1;i++)
{for(j=0;j<n;j++)
printf("%3d",(int)B1[i][j]);
printf("\n");
}
for(i=0;i<m-1;i++)//求B11
for(j=0;j<n-m+1;j++)
b11[i][j]=B1[i][j];
for(i=0;i<m-1;i++)//求B12
for(j=n-m+1;j<n;j++)
b12[i][j-n+m-1]=B1[i][j];
for(i=0;i<m-1;i++)//求-ZB11
for(j=0;j<n-m+1;j++)
zb11[j][i]=-(int)b11[i][j];
for(i=0;i<m-1;i++)//求ZB12
for(j=0;j<m-1;j++)
zb12[j][i]=b12[i][j];
/*从这里开始把二维数组接入一位数组,(因为动态二维数组分配的内存空间不是连续的,
所以用 一个一维数组记录他的数据好传给逆矩阵的调用函数)*/
for (i=0; i<m-1; i++)
for(j=0;j<m-1;j++)
{
AA[i*(m-1)+j]=zb12[i][j];//这里必须给AA 和B赋值 我把zb12赋值给它们 不然是随机数
B[i*(m-1)+j]=zb12[i][j];
}
i=brinv(AA,M);//求逆矩阵调用函数
k=0;
for(i=0;i<m-1;i++)//把所求得逆矩阵,从新变成二维数组,方便C12的计算
for(j=0;j<m-1;j++)
{
nzb12[i][j]=AA[k];
k++;
}
for (i=0;i<n-m+1;i++)//这里必须给c12赋0,不然求不出c12
for (j=0;j<m-1;j++)
c12[i][j]=0.0;
for (i=0;i<n-m+1;i++)//求c12的过程,用循环语句来计算矩阵的乘法
{
for (j=0;j<m-1;j++)
{
for (k=0;k<m-1;k++)
{
c12[i][j]=c12[i][j]+zb11[i][k]*nzb12[k][j];//矩阵的乘法
}
}
}
for(i=0;i<n-m+1;i++)/*求cf矩阵的过程*/
for(j=0;j<n-m+1;j++)
if(i==j)
cf[i][j]=1.0;
else
cf[i][j]=0.0;
for(i=0;i<n-m+1;i++)
for(j=0;j<m-1;j++)
cf[i][j+n-m+1]=c12[i][j];
printf("独立回路矩阵cf:\n");//输出cf矩阵
for(i=0;i<n-m+1;i++)
{
for(j=0;j<n;j++)
printf("%3d",(int)cf[i][j]);
printf("\n");
}
for(i=0;i<n-m+1;i++)//求s11矩阵的过程
for(j=0;j<m-1;j++)
s11[j][i]=-c12[i][j];
for(i=0;i<m-1;i++)////求sf矩阵的过程
sf[i][i+n-m+1]=1;
for(i=0;i<m-1;i++)
for(j=0;j<n-m+1;j++)
sf[i][j]=s11[i][j];
printf("独立割集矩阵sf:\n");
for(i=0;i<m-1;i++)//输出sf矩阵
{
for(j=0;j<n;j++)
printf("%3d",(int)sf[i][j]);
printf("\n");
}
}
void Create_Omr(int m,int n)//创建各个矩阵
{ int i;
printf("你输的是一个%d,%d图\n",m,n);
a=(double **)malloc(m*sizeof(double));
b11=(double **)malloc((m-1)*sizeof(double));
b12=(double **)malloc((m-1)*sizeof(double));
zb11=(double **)malloc((n-m+1)*sizeof(double));
zb12=(double **)malloc((m-1)*sizeof(double));
C=(double *)malloc((m-1)*(m-1)*sizeof(double));
B=(double *)malloc((m-1)*(m-1)*sizeof(double));
AA=(double *)malloc((m-1)*(m-1)*sizeof(double));
cf=(double **)malloc((n-m+1)*sizeof(double));
sf=(double **)malloc((m-1)*sizeof(double));
s11=(double **)malloc((m-1)*sizeof(double));
B1=(double **)malloc((m-1)*sizeof(double));
nzb12=(double **)malloc((m-1)*sizeof(double));
c12=(double **)malloc((n-m+1)*sizeof(double));
Q=(double *)malloc(n*sizeof(double));
Z=(double *)malloc(n*sizeof(double));
for(i = 0; i < m; i++)
a[i] = (double *)malloc(n * sizeof(double));//动态分配矩阵列数组
for(i = 0; i < m-1; i++)
b11[i] = (double *)malloc((n-m+1) * sizeof(double));//动态分配矩阵列数组
for (i=0;i<m-1;i++)
{
b12[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组
zb12[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组
nzb12[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组
s11[i]= (double *)malloc((n-m+1) * sizeof(double));//动态分配矩阵列数组
sf[i]=(double *)malloc(n * sizeof(double));//动态分配矩阵列数组
B1[i]=(double *)malloc(n * sizeof(double));//动态分配矩阵列数组
}
for (i=0;i<n-m+1;i++)
{zb11[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组
c12[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组
cf[i]=(double *)malloc(n * sizeof(double));//动态分配矩阵列数组
}
}
int brinv(double *a, int n)//求逆矩阵的函数
{ int *is,*js,i,j,k,l,u,v;
double d,p;
is=malloc(n*sizeof(double));
js=malloc(n*sizeof(double));
for (k=0; k<=n-1; k++)
{ d=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=i*n+j; p=fabs(a[l]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+1.0==1.0)
{ free(is); free(js); printf("err**not inv\n");
return(0);
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=is[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+js[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
l=k*n+k;
a[l]=1.0/a[l];
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=k*n+j; a[u]=a[u]*a[l];}
for (i=0; i<=n-1; i++)
if (i!=k)
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=i*n+j;
a[u]=a[u]-a[i*n+k]*a[k*n+j];
}
for (i=0; i<=n-1; i++)
if (i!=k)
{ u=i*n+k; a[u]=-a[u]*a[l];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=js[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+is[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
}
free(is); free(js);
return(1);
}
///注意,用malloc动态分配数组,本应该释放的,但为了程序短一点,所以就不释放了。不释放也不会影响程序的
我是用动态分配储存空间的方法分配二维数组的(也就是矩阵),所以写程序是通用的。可以求所有m,n 图(全过程不用改程序,求Bk也不用改),不只是5,7图。(我把我们上课做的作业6,9图,也输进去了结果也是对的)我的基本关联矩阵Bk是自己输的,输1,就是求B1,输2就是求B2,输3就是求B3,等等(下面运行所求BK也是对的),我想这些就是我与其他同学不同的地方吧!在写这个程序的过程中,用动态定义的二维数组(不连续)与直接定的二维数组(连续)在分配存储单元不同,所以求逆矩阵成为一个难题,因为不连续传过去的首地址只能取一行的数据,所以求不出逆矩阵)最后终于把这个问题解决了,所以写出了这个程序,还是蛮开心的!以下是我运行的结果,,,,
附录资料:不需要的可以自行删除
bat文件的基本应用
bat是dos下的批处理文件
.cmd是nt内核命令行环境的另一种批处理文件
从更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由专用解释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。所以从某个程度分析,batch, unix shell, awk, basic, perl 等脚本语言都是一样的,只不过应用的范围和解释的平台各有不同而已。甚至有些应用程序仍然沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完全不同。
===================================
首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。
==== 注 ===================
批处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普通数据性文件,这缘于windows系统这个新型解释平台的涉入,使得批处理的应用越来越"边缘化"。所以我们讨论的批处理应该限定在dos环境或者命令行环境中,否则很多观念和设定都需要做比较大的变动。
========================
其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。
==== 注 ==================
批处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码,但只有编译连接后的exe文件才可以称之为c语言程序。因为批处理文件本身既具有文本的可读性,又具有程序的可执行性,这些称谓的界限是比较模糊的。
===========================
第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:\BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:\batch,你就可以在任意位置运行所有你编写的批处理程序。
==== 注 =====
纯以dos系统而言,可执行程序大约可以细分为五类,依照执行优先级由高到低排列分别是:DOSKEY宏命令(预先驻留内存),COMMAND.COM中的内部命令(根据内存的环境随时进驻内存),以com为扩展名的可执行程序(由 直接载入内存),以exe位扩展名的可执行程序(由 重定位后载入内存),以bat位扩展名的批处理程序(由 解释分析,根据其内容按优先级顺序调用第2,3,4,5种可执行程序,分析一行,执行一行,文件本身不载入内存)
============
第四,在DOS和Win9x/Me系统下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等。下面是一个运行于Windows 98下的autoexec.bat的示例:
@ECHO OFF
PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;
C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH
LH SMARTDRV.EXE /X
LH DOSKEY.COM /insert
LH CTMOUSE.EXE
SET TEMP=D:\TEMP
SET TMP=D:\TEMP
==== 注 =====
AUTOEXEC.BAT为DOS系统的自动运行批处理文件,由COMMAND.COM启动时解释执行;
而在Win9x环境中,不仅增加支持了 DOSSTART.BAT, WINSTART.BAT 等许多其它自动运行的批处理文件,对AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等许多变体以适应复杂的环境和多变的需求。
==== willsort 编注 =============
以下关于命令的分类,有很多值得推敲的地方。常用命令中的@本不是命令,而dir、copy等也很常用的命令却没有列入, 而特殊命令中所有命令对我来说都是常用命令。建议将批处理所引用的命令分为内部命令、外部命令、第三方程序三类。而内部命令和外部命令中别有一类是专用于或常用于批处理中的命令可称之为"批处理命令"。
以下摘录MS-DOS 6.22 帮助文档中关于"批处理命令"的文字,当然,其中有些概念和定义已经有些落后了。
批处理命令
批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件,扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时,MS-DOS成组执行此批处理程序中的命令。
任何在命令提示符下可使用的命令都可用在批处理程序中。此外,下面MS-DOS命令是专门在批处理程序中使用的。
==========
常用命令
echo、@、call、pause、rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。
==== 注 ===========
首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符:
CR(0D) 命令行结束符
Escape(1B) ANSI转义字符引导符
Space(20) 常用的参数界定符
Tab(09) ; = 不常用的参数界定符
+ COPY命令文件连接符
* ? 文件通配符
"" 字符串界定符
| 命令管道符
< > >> 文件重定向符
@ 命令行回显屏蔽符
/ 参数开关引导符
: 批处理标签引导符
% 批处理变量引导符
其次, :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意:
第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号.
第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中.
=====================
echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。
==== 注 =====
此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理
-------------------------
ECHO
当程序运行时,显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。
在运行批处理程序时,MS-DOS一般在屏幕上显示(回显)批处理程序中的命令。
使用ECHO命令可关闭此功能。
语法
ECHO [ON|OFF]
若要用echo命令显示一条命令,可用下述语法:
echo [message]
参数
ON|OFF
指定是否允许命令的回显。若要显示当前的ECHO的设置,可使用不带参数的ECHO
命令。
message
指定让MS-DOS在屏幕上显示的正文。
-------------------
CALL
从一个批处理程序中调用另一个批处理程序,而不会引起第一个批处理的中止。
语法
CALL [drive:][path]filename [batch-parameters]
参数
[drive:][path]filename
指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。
batch-parameters
指定批处理程序所需的命令行信息。
-------------------------------
PAUSE
暂停批处理程序的执行并显示一条消息,提示用户按任意键继续执行。只能在批处
理程序中使用该命令。
语法
PAUSE
REM
在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令(在CONFIG.SYS
中也可以用分号 ; 代替REM命令,但在批处理文件中则不能替代)。
语法
REM [string]
参数
string
指定要屏蔽的命令或要包含的注解。
=======================
例1:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。
批处理文件的内容为: 命令注释:
@echo off 不显示后续命令行及当前命令行
dir c:\*.* >a.txt 将c盘文件列表写入a.txt
call c:\ucdos\ucdos.bat 调用ucdos
echo 你好 显示"你好"
pause 暂停,等待按键继续
rem 准备运行wps 注释:准备运行wps
cd ucdos 进入ucdos目录
wps 运行wps
批处理文件的参数
批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符"%"。
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。
例2:C:根目录下有一批处理文件名为f.bat,内容为:
@echo off
format %1
如果执行C:\>f a:
那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时实际执行的是format a:
例3:C:根目录下一批处理文件名为t.bat,内容为:
@echo off
type %1
type %2
那么运行C:\>t a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
于是上面的命令将顺序地显示a.txt和b.txt文件的内容。
==== 注 ===============
参数在批处理中也作为变量处理, 所以同样使用百分号作为引导符, 其后跟0-9中的一个数字构成参数引用符. 引用符和参数之间 (例如上文中的 %1 与 a: ) 的关系类似于变量指针与变量值的关系. 当我们要引用第十一个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下:
初始状态, cmd 为命令名, 可以用 %0 引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
经过1次shift后, cmd 将无法被引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8
遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针.
=================
特殊命令
if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。
一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:
1、if [not] "参数" == "字符串" 待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。
例:if "%1"=="a" format a:
====
if 的命令行帮助中关于此点的描述为:
IF [NOT] string1==string2 command
在此有以下几点需要注意:
1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种"防空"字符
2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量
3. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行
=============================
2、if [not] exist [路径\]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如: if exist c:\config.sys type c:\config.sys
表示如果存在c:\config.sys文件,则显示它的内容。
****** 注 ********
也可以使用以下的用法:
if exist command
device 是指DOS系统中已加载的设备, 在win98下通常有:
AUX, PRN, CON, NUL
COM1, COM2, COM3, COM4
LPT1, LPT2, LPT3, LPT4
XMSXXXX0, EMMXXXX0
A: B: C: ...,
CLOCK$, CONFIG$, DblBuff$, IFS$HLP$
具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点:
1. 该设备确实存在(由软件虚拟的设备除外)
2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义)
3. 该设备已准备好(主要是指a: b: ..., com1..., lpt1...等)
可通过命令 mem/d | find "device" /i 来检阅你的系统中所加载的设备
另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄.
==================================
3、if errorlevel <数字> 待执行的命令
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2
==== 注 ===========
返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式:
if errorlevel 1 set el=1
if errorlevel 2 set el=2
if errorlevel 3 set el=3
if errorlevel 4 set el=4
if errorlevel 5 set el=5
...
当然, 也可以使用以下循环来替代, 原理是一致的:
for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e
更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章
出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复
展开阅读全文