Board logo

标题: [特效代码] 批处理中在&&、||符号之后@功能为什么会被加强? [打印本页]

作者: Hello123World    时间: 2011-8-15 10:46     标题: 批处理中在&&、||符号之后@功能为什么会被加强?

我也不知道该怎么问了,好像是预处理的原因,又好像是&&、||的原因,跟进一步可能是@的原因,毕竟一直以来@都没找到官方的解释,只不过是人人传诵——关闭回显。

原帖地址:http://bbs.bathome.net/redirect. ... 9&fromuid=30829

&& ,||是根据前面的语句成功与否选择执行下一条语句。
  1. fc /b 1.txt ah.txt && @echo hello || @echo life
  2. pause
复制代码
这两个文件不同,也没有显示life,为什么?(第一问已解决)

竟然是@的问题,这又为什么,我关闭的只是echo 本身的回显,为什么life没有输出?
  1. fc /b 1.txt ah.txt && echo hello || echo life
  2. pause
复制代码

作者: raymai97    时间: 2011-8-15 11:22

理由很简单
试试
  1. @echo off
  2. pause
复制代码
  1. echo off
  2. pause
复制代码

作者: Hello123World    时间: 2011-8-15 11:27

回复 2# raymai97


    你根本就没明白我的意思,也没有完全弄懂echo的语法,
  1. 显示信息,或将命令回显打开或关上。
  2.   ECHO [ON | OFF]
  3.   ECHO [message]
  4. 要显示当前回显设置,键入不带参数的 ECHO。
复制代码
off和on是关键字,相当于:
  ECHO [ON | OFF]

但是no 和hello却不是。
  ECHO [message]
作者: Hello123World    时间: 2011-8-15 11:31

鉴于大家有可能把no看成是on,我no改为life……
作者: raymai97    时间: 2011-8-15 11:35

回复 3# Hello123World


    好吧,你说life没有显示,那么2个文件相同时,hello有显示么?
作者: hanyeguxing    时间: 2011-8-15 11:41

本帖最后由 hanyeguxing 于 2011-8-15 11:48 编辑

1,@的作用是关闭@后的回显
2,@隐含作用是将@后的内容分组()
原始 命令1+连接符1+命令2+连接符2+命令3+连接符3+命令4
如果在 命令2 前加 @ ,则逻辑关系改为 命令1+连接符1+@(命令2+连接符2+命令3+连接符3+命令4)
那么:
  1. fc /b 1.txt ah.txt && @echo hello || @echo life
  2. pause
复制代码
这段代码书写存在问题,如果要 @ 的分别是echo hello和echo life,则应写成:
  1. fc /b 1.txt ah.txt &&(@echo hello)||(@echo life)
  2. pause
复制代码
通过()强制@的分组范围
作者: raymai97    时间: 2011-8-15 11:42

我测试了下,这样其实也没问题:
fc /b a.txt b.txt && echo hello || @echo life

这样就有问题:
fc /b a.txt b.txt && @echo hello || @echo life
作者: 601997526    时间: 2011-8-15 12:00

6楼正解
如果一定要用多个@符可以这样写
  1. fc /b 1.txt ah.txt && (@echo a) || (@echo b)
复制代码

作者: CrLf    时间: 2011-8-15 12:06

回复 6# hanyeguxing


    问题是 @ 屏蔽的是预处理输出(由 cmd 预处理产生),而 echo 显示的是句柄 1 的输出(由命令执行结果产生),想不通这里的句柄输出怎么会被当成预处理输出屏蔽掉
作者: hanyeguxing    时间: 2011-8-15 12:17

本帖最后由 hanyeguxing 于 2011-8-15 12:18 编辑

回复 9# CrLf


   
罚你面壁1秒种,把这个问题想明白......
作者: 601997526    时间: 2011-8-15 12:34

回复 9# CrLf


    这个问题还是没有看明白吗?我想你们直接执行下面这句试试就知道了
  1. fc /b 1.txt 2.txt || @echo a && @echo b
复制代码
说明白点就是批处理把@后面的命令都当作一个命令语句来执行了
作者: 601997526    时间: 2011-8-15 12:37

这个我可能表达的不是很清楚,至于到底是@的原因还是&&或||的原因还有待大家去探索
作者: hanyeguxing    时间: 2011-8-15 12:59

本帖最后由 hanyeguxing 于 2011-8-15 13:00 编辑

回复 9# CrLf


回复 12# 601997526


       怎么可以这样捏?怎么可以学了预处理就把关闭回显给忘记了捏?什么是回显被关闭?
  1. @set a=1
  2. @echo;测%a%试
复制代码
就是不显示运行的命令而只显示运行后的结果。当@关闭了回显就不需要操心预处理显示的问题!~
作者: CrLf    时间: 2011-8-15 15:39

回复 6# hanyeguxing


    哦,明白了,原来是强制分组噢
作者: Hello123World    时间: 2011-8-15 16:07

9楼纠结在问题中,我纠结在看不懂9楼的问题中,关键词“预处理”我一直把它理解为批处理的“编译过程”,“句柄”理解为各种返回值得存储空间。
  1. fc /b 1.txt ah.txt && @echo hello || @echo life
  2. pause
复制代码
按照6楼给出的“@具有分组性”,上面的代码就是语法错误,类似这样:
fc /b 1.txt ah.txt && (echo hello || (echo life))
echo life永远不会被执行。但正确会执行echo hello。

经验证,果然如此:
1.txt 和3.txt内容一样。
  1. C:\Users\helloworld\Desktop>fc /b 1.txt 3.txt && @echo hello || @echo life
  2. 正在比较文件 1.txt 和 3.TXT
  3. FC: 找不到差异
  4. hello
复制代码
反证:@隐含作用是将@后的内容分组()

连@隐含作用都知道,果然犀利!——我对你的敬仰犹如滔滔江水……,你懂得~
作者: cjiabing    时间: 2011-8-15 18:55

本帖最后由 cjiabing 于 2011-8-15 18:59 编辑

我试了一下,没见有什么不妥啊?
  1. fc /b c:\boot.ini c:\windows\vb.ini && (@echo hello) || @echo life
复制代码
如果说第一个echo用@导致后面的echo执行不了,那八成就是FC把后面所有的命令都当成一个统一的命令了。
一般使用  || 和 && 都需要用括号进行结构区分。
但以上与@没有多大的关系,有没有@都一样执行。你的问题与命令结构有关,与预处理有关。




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