找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 65669|回复: 15

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

[复制链接]
发表于 2011-8-15 10:46:31 | 显示全部楼层 |阅读模式
我也不知道该怎么问了,好像是预处理的原因,又好像是&&、||的原因,跟进一步可能是@的原因,毕竟一直以来@都没找到官方的解释,只不过是人人传诵——关闭回显。

原帖地址: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
复制代码
发表于 2011-8-15 11:22:15 | 显示全部楼层
理由很简单
试试
  1. @echo off
  2. pause
复制代码
  1. echo off
  2. pause
复制代码
 楼主| 发表于 2011-8-15 11:27:30 | 显示全部楼层
回复 2# raymai97


    你根本就没明白我的意思,也没有完全弄懂echo的语法,
  1. 显示信息,或将命令回显打开或关上。

  2.   ECHO [ON | OFF]
  3.   ECHO [message]

  4. 要显示当前回显设置,键入不带参数的 ECHO。
复制代码
off和on是关键字,相当于:
  ECHO [ON | OFF]

但是no 和hello却不是。
  ECHO [message]
 楼主| 发表于 2011-8-15 11:31:40 | 显示全部楼层
鉴于大家有可能把no看成是on,我no改为life……
发表于 2011-8-15 11:35:10 | 显示全部楼层
回复 3# Hello123World


    好吧,你说life没有显示,那么2个文件相同时,hello有显示么?
发表于 2011-8-15 11:41:14 | 显示全部楼层
本帖最后由 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技术 +2 收起 理由
CrLf + 1 Nice
Hello123World + 1 @果然还有其它的功能吗。

查看全部评分

发表于 2011-8-15 11:42:16 | 显示全部楼层
我测试了下,这样其实也没问题:
fc /b a.txt b.txt && echo hello || @echo life

这样就有问题:
fc /b a.txt b.txt && @echo hello || @echo life
发表于 2011-8-15 12:00:31 | 显示全部楼层
6楼正解
如果一定要用多个@符可以这样写
  1. fc /b 1.txt ah.txt && (@echo a) || (@echo b)
复制代码
发表于 2011-8-15 12:06:18 | 显示全部楼层
回复 6# hanyeguxing


    问题是 @ 屏蔽的是预处理输出(由 cmd 预处理产生),而 echo 显示的是句柄 1 的输出(由命令执行结果产生),想不通这里的句柄输出怎么会被当成预处理输出屏蔽掉
发表于 2011-8-15 12:17:18 | 显示全部楼层
本帖最后由 hanyeguxing 于 2011-8-15 12:18 编辑

回复 9# CrLf


   
罚你面壁1秒种,把这个问题想明白......
发表于 2011-8-15 12:34:15 | 显示全部楼层
回复 9# CrLf


    这个问题还是没有看明白吗?我想你们直接执行下面这句试试就知道了
  1. fc /b 1.txt 2.txt || @echo a && @echo b
复制代码
说明白点就是批处理把@后面的命令都当作一个命令语句来执行了
发表于 2011-8-15 12:37:06 | 显示全部楼层
这个我可能表达的不是很清楚,至于到底是@的原因还是&&或||的原因还有待大家去探索
发表于 2011-8-15 12:59:07 | 显示全部楼层
本帖最后由 hanyeguxing 于 2011-8-15 13:00 编辑

回复 9# CrLf


回复 12# 601997526


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


    哦,明白了,原来是强制分组噢
 楼主| 发表于 2011-8-15 16:07:59 | 显示全部楼层
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
复制代码
反证:@隐含作用是将@后的内容分组()

连@隐含作用都知道,果然犀利!——我对你的敬仰犹如滔滔江水……,你懂得~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 22:36 , Processed in 0.022778 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表