中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 为什么在if中被比较的变量不加引号就不能直接截取呢?
作者:
标题: 为什么在if中被比较的变量不加引号就不能直接截取呢? 上一主题 | 下一主题
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『楼 主』:  为什么在if中被比较的变量不加引号就不能直接截取呢?

1,有这样一个变量,他是由数字构成,前面为若干个0,去掉这些0,我可以用这样的方法:批处理1
@echo off&setlocal enabledelayedexpansion
set E=000001
call :D !E!
echo 结果!E!
pause&exit
:D
set E=%1
:F
if "!E:~0,1!" == "0" set E=!E:~1!&goto F
2,因为这里使用了call和两个标签,我想换一个方法,通过00=0来判断。
测试:批处理2
@echo off
set a=000
if "%a%" == "00" (echo 等于1) else echo 不等1
if "%a%" == 00 (echo 等于2) else echo 不等2
if %a% == 00 (echo 等于3) else echo 不等3
if "%a%" equ "00" (echo 等于4) else echo 不等4
if "%a%" equ 00 (echo 等于5) else echo 不等5
if %a% equ 00 (echo 等于6) else echo 不等6
pause
运行结果:
不等1
不等2
不等3
不等4
不等5
等于6

所以,使用 equ 及不使用引号,就可以实现比较时000等于0。
3,于是,做了一个这样的批处理:批处理3
@echo off&setlocal enabledelayedexpansion
set E=000001
for /l %%k in (5 -1 1) do if !E:~0,%%k! equ 0 set E=!E:~%%k!
echo 结果!E!
pause
出现错误:此时不应有 %k!。
只能写成这样才可以:批处理4
@echo off&setlocal enabledelayedexpansion
set E=000001
for /l %%k in (5 -1 1) do if "!E:~0,%%k!" equ "00000" set E=!E:~%%k!
echo 结果!E!
pause
运行正常
或者是:批处理5
@echo off&setlocal enabledelayedexpansion
set E=000001
for /l %%k in (5 -1 1) do set F=!E:~0,%%k!&if !F! equ 0 set E=!E:~%%k!
echo 结果!E!
pause
运行正常

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

[ Last edited by Hanyeguxing on 2009-9-19 at 06:57 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-9-19 06:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 2 楼』:  F话不多说,自己研究更有成就。

在逗号前加个转义符,变成:^,



┌───────┐
├→学习→实践→┤
└───────┘
2009-9-19 11:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 3 楼』:  

if 不支持变量二次扩展



49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-9-20 09:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
q8249014
初级用户





积分 175
发帖 45
注册 2007-8-4
状态 离线
『第 4 楼』:  

2f说的是对的,可是没有说明原因

先请楼主运行以下代码
if 1, equ 1 echo ok
pause>nul

if 1 equ 1 echo ok
pause>nul
可见以上两段代码执行的结果都是一样的

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

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

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

"if 1 EQU 1 echo ok"

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

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

就成功啦

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

那么lz的代码就应该变为以下代码
@echo off&setlocal enabledelayedexpansion
set E=000001
for /l %%k in (5 -1 1) do if !E:~0^,%%k! equ 0 set E=!E:~%%k!
echo 结果!E!
pause
或者可以这样理解

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

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

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

请执行
if !E:~0 %%k! equ 0 set E=!E:~%%k!
也就是说空格(分隔符)后面应该为比较运算符 而你却写成了 %%k!

它自然就报错了
if 1 1

if 1,geq,1,echo.ok
我想试完以上代码 你应该就明白了 o(∩_∩)o...

[ Last edited by q8249014 on 2009-9-20 at 11:10 ]

2009-9-20 09:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 5 楼』:  

.....
if %a:~0^,1% equ 1 echo ok
if %a:~0,1% equ 1 echo ok
自已测试下



49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-9-20 13:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 6 楼』:  


set "a b=123"
set "a,b=123"
set a=123
if %a b% equ 123 echo 相等1
if %a,b% equ 123 echo 相等2
if %a:~0,1% equ 1 echo 相等3
setlocal enabledelayedexpansion
if %a b% equ 123 echo 相等4
if %a,b% equ 123 echo 相等5
if !a^ b! equ 123 echo 相等6
if !a^,b! equ 123 echo 相等7
if %a:~0,1% equ 1 echo 相等8
if !a:~0^,1! equ 1 echo 相等9
pause
为什么只有!!内才需要这样,%%内就不需要。。。。。。



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-9-21 04:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 7 楼』:  

预处理时,,;=空格(共四个)被作为参数分隔符了,

   此帖被 +4 点积分        点击查看详情   
评分人:【 Hanyeguxing 分数: +4  时间:2009-9-21 04:21




山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-9-21 04:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by everest79 at 2009-9-20 09:05:
if 不支持变量二次扩展

这样



49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-9-21 04:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
q8249014
初级用户





积分 175
发帖 45
注册 2007-8-4
状态 离线
『第 9 楼』:  

回6f:
@set a=123
if %a:~0,1% equ 1 echo 相等8
@pause>nul
运行以上代码 看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

2009-9-21 06:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: