中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-10 09:02
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]为什么“if not exist……”语句不会跳转? 查看 2,217 回复 14
楼 主 [已结]为什么“if not exist……”语句不会跳转? 发表于 2006-04-30 12:57 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
如题。举一个例子:
@echo off
if not exist C:\menu.lst goto step1
grub.exe
root (hd0,0)
chainloader +1
boot

:step1
echo The "C:\menu.lst" is not exist!
echo The system is going to be shut.
shut.bat
goto quit

C盘中的menu.lst被删除,然后执行上面的批处理,结果还是不会跳转到step1去!!!
这是为什么?
请高手指点。
谢谢。

[ Last edited by HAT on 2008-11-13 at 17:36 ]
2 发表于 2006-04-30 13:04 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
20年会员
UID 53056
状态 离线
我也遇到过这种情况 用if语句判断的时候总是会出问题
后来我在群内高手的指点下用dir+&做的跳转
3 发表于 2006-04-30 13:18 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
我测试了一下,用 “if exist ……”语句是可以跳转的。

不知为什么?
4 发表于 2006-04-30 13:24 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
用dir+&怎么做的跳转?

怎么写的?

请举例,让我也学习学习。
5 发表于 2006-04-30 13:41 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
已经解决了。“if not exist……”语句是可以跳转的。

出现1楼所描述的原因在于,本人把该段批处理的命名与要执行的程序名一样,结果在手工输入该批处理时,没有加上后缀“.bat”的缘故。
6 发表于 2006-04-30 15:28 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
20年会员
UID 53056
状态 离线
我上次是检测某个'参数'是文件还是目录时用了


if exist %a%\. goto b

结果他怎么都不跳转

后来用了

dir %a%\. >nul 2>nul & goto b
7 发表于 2006-04-30 17:08 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
dir %a%\. >nul 2>nul & goto b 这句看不懂,能不能解释一下?

特别是“ >nul 2>nul &”
8 发表于 2006-04-30 18:15 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
20年会员
UID 53056
状态 离线
呵呵 每个文件夹下都存在2个目录 1 是. 2是..
对不存在的目录使用dir的时候它会返回错误值

而我的目的是得知它存在不存在 所以不论正确与否 dir的执行结果我是不需要显示出来的

我只需要用& 来取它的结果
9 发表于 2006-04-30 18:21 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
用dir C:\menu.lst >nul 2>nul && goto step1吧。
dir %a%\. >nul 2>nul & goto b这句的意思是:
查找名为%a%的目录,然后跳转到标号b处。这句执行完后不管是否存在目录%a%都会跳转到b处,所以应该和你的要求有所偏差。
>nul 2>nul表示dir命令产生的信息不在屏幕上显示,具体详细解释可翻一翻论坛老贴。
dir %a%\. 表示查找%a%目录下的.目录,在批处理中,.表示同级目录,".."表示上一级目录,所以dir %a%就是表示查找%a%目录。
补充:
1,此命令是根据dir是否正确执行来跳转,dir是可以直接用来查找目录的,所以可以直接写成dir %a% >nul 2>nul & goto b
2,考虑到命令行中可以能碰到路径包含空格的情况,一般在调用变量的时候两边加上""“号可以防止出错: dir "%a%" >nul 2>nul && goto Label
10 发表于 2006-04-30 21:52 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
dir C:\menu.lst >nul 2>nul && goto step1
这里有两个 &&
分别表示什么意思?
11 发表于 2006-05-01 23:05 ·  中国 广东 云浮 新兴县 电信
荣誉版主
★★★
积分 718
发帖 313
注册 2005-09-26 00:00
20年会员
UID 42844
性别 男
状态 离线
命令1 & 命令2 :单个&号表示,无论前面命令1执行成功与否,命令2照常执行.

命令1 && 命令2 :表示,只有命令1执行成功,并成功返回"0"的参数给命令2时,命令2才会继续.

命令1 | 命令2 与 命令1 || 命令2 的用法类似.
12 发表于 2006-05-02 01:06 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
command1 | command2
表示把command1的输出当作command2的参数。
command1 || command2
表示若command1执行不成功才执行command2,反之则不执行。
13 好! 发表于 2006-05-05 11:03 ·  中国 山东 烟台 电信
新手上路
积分 2
发帖 1
注册 2006-05-05 11:00
20年会员
UID 54962
状态 离线
俺又学了一招呀
14 发表于 2006-05-24 13:03 ·  中国 广东 深圳 罗湖区 电信
初级用户
积分 82
发帖 31
注册 2006-05-23 00:33
20年会员
UID 55824
状态 离线
其实一些"是否"判断用管道符号很方便,用if反而复杂化,一些个人观点.
dir C:\menu.lst &&grub.exe&root (hd0,0)&chainloader +1&boot||echo The "C:\menu.lst" is not exist!&echo The system is going to be shut.
不对的地方请高手指正
15 发表于 2008-11-13 17:10 ·  中国 北京 鹏博士BGP
初级用户
积分 22
发帖 21
注册 2008-11-13 13:44
17年会员
UID 130844
性别 男
状态 离线
学了!
论坛跳转: