[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

原帖地址: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
复制代码

理由很简单
试试
  1. @echo off
  2. pause
复制代码
  1. echo off
  2. pause
复制代码
为何批处理不适合做界面
为何随风讨厌call命令
http://bbs.bathome.net/thread-4482-1-10.html

TOP

回复 2# raymai97


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

但是no 和hello却不是。
  ECHO [message]

TOP

鉴于大家有可能把no看成是on,我no改为life……

TOP

回复 3# Hello123World


    好吧,你说life没有显示,那么2个文件相同时,hello有显示么?
为何批处理不适合做界面
为何随风讨厌call命令
http://bbs.bathome.net/thread-4482-1-10.html

TOP

本帖最后由 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
复制代码
通过()强制@的分组范围
2

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

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

这样就有问题:
fc /b a.txt b.txt && @echo hello || @echo life
为何批处理不适合做界面
为何随风讨厌call命令
http://bbs.bathome.net/thread-4482-1-10.html

TOP

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

TOP

回复 6# hanyeguxing


    问题是 @ 屏蔽的是预处理输出(由 cmd 预处理产生),而 echo 显示的是句柄 1 的输出(由命令执行结果产生),想不通这里的句柄输出怎么会被当成预处理输出屏蔽掉

TOP

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

回复 9# CrLf


   
罚你面壁1秒种,把这个问题想明白......
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 9# CrLf


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

TOP

这个我可能表达的不是很清楚,至于到底是@的原因还是&&或||的原因还有待大家去探索

TOP

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

回复 9# CrLf


回复 12# 601997526


       怎么可以这样捏?怎么可以学了预处理就把关闭回显给忘记了捏?什么是回显被关闭?
  1. @set a=1
  2. @echo;测%a%试
复制代码
就是不显示运行的命令而只显示运行后的结果。当@关闭了回显就不需要操心预处理显示的问题!~
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 6# hanyeguxing


    哦,明白了,原来是强制分组噢

TOP

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
复制代码
反证:@隐含作用是将@后的内容分组()

连@隐含作用都知道,果然犀利!——我对你的敬仰犹如滔滔江水……,你懂得~

TOP

返回列表