中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 15:38
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » 为什么在if中被比较的变量不加引号就不能直接截取呢?
可打印版本  835 / 8
第1楼 Hanyeguxing 发表于 2009-09-19 06:35
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂
为什么在if中被比较的变量不加引号就不能直接截取呢?
1,有这样一个变量,他是由数字构成,前面为若干个0,去掉这些0,我可以用这样的方法:批处理1

2,因为这里使用了call和两个标签,我想换一个方法,通过00=0来判断。
测试:批处理2

运行结果:
不等1
不等2
不等3
不等4
不等5
等于6

所以,使用 equ 及不使用引号,就可以实现比较时000等于0。
3,于是,做了一个这样的批处理:批处理3

出现错误:此时不应有 %k!。
只能写成这样才可以:批处理4

运行正常
或者是:批处理5

运行正常

为什么在这里(批处理3),不使用引号就不能直接截取!E:~0,%%k!呢?

[ Last edited by Hanyeguxing on 2009-9-19 at 06:57 ]
第2楼 wxcute 发表于 2009-09-19 11:16
中级用户 发帖 211 积分 458
F话不多说,自己研究更有成就。
在逗号前加个转义符,变成:^,
第3楼 everest79 发表于 2009-09-20 09:05
金牌会员 发帖 1,127 积分 2,564
if 不支持变量二次扩展
第4楼 q8249014 发表于 2009-09-20 09:05
初级用户 发帖 45 积分 175
2f说的是对的,可是没有说明原因

先请楼主运行以下代码






可见以上两段代码执行的结果都是一样的

代码中没有用"echo off" 楼主可以把cmd屏幕中的命令行和以上代码比较一下

就会发现cmd在预处理的时候会把IF后需要比较字符中的某些特殊字符过滤掉。

通过比较cmd屏幕回显中的命令可以发现实际上连段代码执行的都是

"if 1 EQU 1 echo ok"

所以上面两段代码的执行结果才会一样

在你的代码中 加上"^"就把","转义为普通字符 所以

就成功啦

类似的字符还有";" 还有什么特殊字符lz有兴趣自己找一下 o(∩_∩)o...

那么lz的代码就应该变为以下代码



或者可以这样理解

我们知道","在批处理中起分隔符的作用

那么 " if !E:~0^,%%k! equ 0 set E=!E:~%%k!"

就变成了 "if !E:~0 %%k! equ 0 set E=!E:~%%k!"

请执行

也就是说空格(分隔符)后面应该为比较运算符 而你却写成了 %%k!

它自然就报错了





我想试完以上代码 你应该就明白了 o(∩_∩)o...

[ Last edited by q8249014 on 2009-9-20 at 11:10 ]
第5楼 everest79 发表于 2009-09-20 13:52
金牌会员 发帖 1,127 积分 2,564
.....
if %a:~0^,1% equ 1 echo ok
if %a:~0,1% equ 1 echo ok
自已测试下
第6楼 Hanyeguxing 发表于 2009-09-21 04:08
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂


为什么只有!!内才需要这样,%%内就不需要。。。。。。
第7楼 plp626 发表于 2009-09-21 04:09
银牌会员 发帖 1,020 积分 2,278
预处理时,,;=空格(共四个)被作为参数分隔符了,
第8楼 everest79 发表于 2009-09-21 04:14
金牌会员 发帖 1,127 积分 2,564
Originally posted by everest79 at 2009-9-20 09:05:
if 不支持变量二次扩展




这样
第9楼 q8249014 发表于 2009-09-21 06:27
初级用户 发帖 45 积分 175
回6f:



运行以上代码 看CMD屏幕中的代码 可以发现 执行的是

"if 1 EQU 1 echo 相等8"

其实还是CMD预处理的问题 %%的优先级比!!高 在预处理时(命令执行之前)

%a:~0,1%就被替换为1了 所以不会出错

关于这个"优先级"的问题 以前 bjsh版主讨论过这个问题

以下是bjsh版主写的那篇帖子

http://www.cn-dos.net/forum/viewthread.php?tid=30884&fpage=1&highlight=%2Bbjsh
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023