Board logo

标题: [其他] [已解决]请教1个不理解的批处理if命令 [打印本页]

作者: czjt1234    时间: 2010-5-3 11:09     标题: [已解决]请教1个不理解的批处理if命令

if !d:~0^,1!==0

if !d:~0,1!==0这样的我理解,加了^是什么意思


另外
set p=%a%

set "p=%a%" 这个引号的作用是否就仅仅是防空格

[ 本帖最后由 czjt1234 于 2010-5-3 20:00 编辑 ]
作者: hanyeguxing    时间: 2010-5-3 11:59

对于一般的字符比较,推荐使用==,而不推荐使用运算符如equ或neq
在使用==时,推荐比较的两个字符串都被括起来.
在不括起来的时候:if %a:~0,1%==1 echo.为1
在预处理时%a:~0,1%直接被替换成其值,然后执行if 比较,例如a为5,则实际执行的就是 if 5==1 echo.为1
而if !a:~0,1!==1 echo.为1在预处理时!a::~0,1!并不替换,这就导致预处理之后执行if !a:~0,1!==1 echo.为1
命令解释器会将这个逗号,当成分隔符,从而造成语法错误,这个时候使用^使预处理时失去分隔作用。
通过下面这个批处理示例,可以说明不延迟的变量与延迟的变量,在预处理时发生了什么变化。
  1. @setlocal enabledelayedexpansion
  2. @set a=5
  3. echo.不延迟%a%
  4. echo.延迟的!a!
  5. @pause
复制代码
类似的还有echo.!a:~0^,1!等
相关资料论坛内搜索“预处理”和“变量延迟”
原帖由 czjt1234 于 2010-5-3 11:09 发表
另外
set p=%a%

set "p=%a%" 这个引号的作用是否就仅仅是防空格

是预防%a%中存在&或|等敏感字符的。例如:
  1. @echo off
  2. set "a=1&2"
  3. set b=%a%
  4. set
  5. pause
复制代码
至于空格,=后是允许有的,可以不用引号括起来。所以,下面示例的写法是错误的
  1. set a=1 & set b=0
复制代码
这个命令对a赋的值不是1,而是“1 ”,即将1连同后面的空格同时赋值了。

[ 本帖最后由 hanyeguxing 于 2010-5-3 12:57 编辑 ]
作者: Batcher    时间: 2010-5-3 13:04     标题: 回复 2楼 的帖子

==和equ相比,有哪些好处?
作者: hanyeguxing    时间: 2010-5-3 13:17

例如字符比较05和5
  1. ,@,echo off
  2. ,if,05==5,(echo,yes1)else,echo,no1
  3. ,for,/l,%%a,in,(1,1,3),do,echo,
  4. ,if,"05",equ,"5",(echo,yes2)else,echo,no2
  5. ,pause
复制代码
==可以比equ少占7个字符的位置呢,哈哈

[ 本帖最后由 hanyeguxing 于 2010-5-3 13:44 编辑 ]
作者: gudou    时间: 2010-5-4 13:47

跟着学习了,原来一直纳闷为什么有的变量用%a%,有时却用!a!……现在有点明白了。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2