Board logo

标题: [特效代码] 一句什么命令可屏蔽整个批处理的正常输出,不用每句后都>nul? [打印本页]

作者: Cameron    时间: 2008-10-16 18:19     标题: 一句什么命令可屏蔽整个批处理的正常输出,不用每句后都>nul?

本帖最后由 pcl_test 于 2016-9-29 22:49 编辑

在咱们论坛上见过一个类似的帖子,可现在怎么也找不到了。还请各位再讲一遍,或帮忙找出那个帖子,拜托了!
作者: namejm    时间: 2008-10-16 18:25

  没有这样的语句,论坛也没有类似的帖子。
作者: pusofalse    时间: 2008-10-16 18:33

可以这样做:
打开cmd,输入批处理的名字,假设为a.bat,输入a.bat>nul,这样即可屏蔽所有标准输出。
利用这个思路,可以用下面的代码来实现:
  1. @echo off
  2. if "%~1" equ "" start/b %~fs0 a>nul&exit
  3. echo test
  4. ver
  5. pause
  6. exit
复制代码
本该显示如下信息:
  1. test
  2. Microsoft Windows XP [版本 5.1.2600]
  3. 请按任意键继续. . .
复制代码
但用了start/b %~fs0 a>nul即将所有的结果屏蔽。
作者: yslyxqysl    时间: 2008-10-16 18:45

rem 1>nul 3>nul
作者: Cameron    时间: 2008-10-16 19:06

我记得那个代码很简洁的,明明见过~
作者: Batcher    时间: 2008-10-16 19:08

这个?
  1. @echo off
  2. (echo a
  3. echo b
  4. echo c
  5. echo d
  6. )>nul
复制代码

作者: Cameron    时间: 2008-10-16 19:21

batcher的方法可以满足需求,thx!
不过还不是我见到的那个方法。
作者: qql528    时间: 2008-10-16 19:23

if "%~1" equ "" start/b %~fs0 a>nul&exit这句怎么理解啊.我一头雾水.~~~!刚开始看批处理
不懂,能解释下吗?
作者: 随风    时间: 2008-10-16 19:55

  1. @echo off
  2. echo. 1>nul 3>nul
  3. echo 标准输出已经全被屏蔽了
  4. echo 这些内容看不见
  5. echo 还是看不见。。
  6. echo. 1>nul 4>con
  7. echo 看见了。。。
  8. echo 已经恢复了
  9. pause
复制代码

[ 本帖最后由 随风 于 2008-10-16 19:56 编辑 ]
作者: Cameron    时间: 2008-10-16 20:01

哈,就是随风版主这个!谢了!我见的那个帖子是您发的吧?
另外,很喜欢你的签名!“上善若水,在能处下,能利万物而不争,夫唯不争,故天下莫能与之争!圣人之境,虽不能至,心向往之!”

再另外,还请解释下控制台设备文件及其参数。

[ 本帖最后由 Cameron 于 2008-10-16 20:11 编辑 ]
作者: 随风    时间: 2008-10-16 20:06

当 批处理中有多处echo需要定向到文本中,可以使用这种方法,以使代码简化
如:、
  1. @echo off
  2. echo abcd>>a.txt
  3. echo 1234>>a.txt
  4. echo ldjfafj>>a.txt
  5. echo 9f7jfa8fd>>a.txt
复制代码
可以这样
  1. @echo off
  2. echo. 1>nul 3>a.txt
  3. echo abcd
  4. echo 1234
  5. echo ljfafja;f
  6. echo flfjalfjadfa;
复制代码

[ 本帖最后由 随风 于 2008-10-16 20:07 编辑 ]
作者: lolo    时间: 2008-10-16 20:54

1 是正常输出
2 是错误输出

Quote:
句柄 句柄的数字代号 说明
STDIN 0 键盘输入
STDOUT 1 输出到命令提示符窗口
STDERR 2 错误输出到命令提示符窗口
UNDEFINED 3-9 这些句柄由应用程序和各个具体工具单独定义。
作者: Cameron    时间: 2008-10-16 21:02

高手很多嘛!
lolo能再详细些吗,或者给出在哪些资料上能查到。
作者: zqz0012005    时间: 2008-10-16 21:58

系统有自带的CMD手册:命令行参考

见我的签名
作者: 随风    时间: 2008-10-16 22:18

看此帖
http://bbs.verybat.org/viewthrea ... a=page%3D1#pid81403
作者: lixiaodaoaaa    时间: 2008-10-17 02:14     标题: 不错 随风的连接也不错

看着不错,就加分,别吝啬
但也别乱加,

感谢随风,我第一次注册时是08.2月份,转眼快一年了,随风的身影经常看见

很佩服你!

呵呵..不知道最近忙不?还好不?
作者: lixiaodaoaaa    时间: 2008-10-17 02:58

原帖由 随风 于 2008-10-16 20:06 发表
当 批处理中有多处echo需要定向到文本中,可以使用这种方法,以使代码简化
如:、@echo off
echo abcd>>a.txt
echo 1234>>a.txt
echo ldjfafj>>a.txt
echo 9f7jfa8fd>>a.txt可以这样

@echo off
echo. 1>nul ...

复制 verybat的内容大家看下.哈
═╬╬═  ═╬╬═  ═╬╬═  ═╬╬═ ═╬╬═  ═╬╬═  ═╬╬═  ═╬╬═ ═╬╬═  ═╬╬═  ═╬╬═  

第一步:在运行“1>nul”之前,1的指向是默认值con,此时代号3~9的指向都是空(初始值),因此系统会把1的指向备份到3(因为3是第一个为空的代号),3就指向了con。就是说系统把1原来的指向复制给了3,目的是语句结束后能找回原来的指向,这就相当于备份。

第二步:现在3的指向是con。然而由于要运行“3>nul”,因此还要备份3的指向。此时4是空的,系统就把3的指向con复制给了4,即4现在指向con。就是说3以4为备份。

第三步:由于“3>nul”使得3指向了nul。

第四步:这行语句结束时,1要找回原来的指向,从以上叙述我们知道,3是1的备份,因此1要通过3来恢复“原来”的指向,但此时3的指向已经变为了nul,故1就指向nul。

第五步:而3要恢复原来的指向就要找4,4指向con,故3恢复为con;4原始指向是空的,其备份在5中,故4的指向恢复到空。



    至此我们理顺一下,现在1指向nul,2指向默认值con,3指向con,4之后都是空指向。那么在运行后两句echo语句时由于1指向nul,即标准输出被重定向到空设备,故显示被屏蔽

═╬╬═  ═╬╬═  ═╬╬═  ═╬╬═ ═╬╬═  ═╬╬═  ═╬╬═  ═╬╬═ ═╬╬═  ═╬╬═  ═╬╬═  

[ 本帖最后由 lixiaodaoaaa 于 2008-10-17 03:00 编辑 ]
作者: everest79    时间: 2008-10-19 07:23

嘿嘿,做两个小试验
打开两个cmd窗口,第一个窗口中输入
echo a 1>nul 3>1.txt
第二个窗口输入
echo a 1>2.txt 3>nul
然后打开1.txt与2.txt看下输出有什么不同

1.txt不但输出了命令执行结果,还包括了cmd自身输出的提示行,并且句柄锁定到了当前的输出
2.txt只输出了命令的结果

我们可以把cmd窗口理解为一个句柄载体,上边有0-9个句柄,0,1,2做了相关定义3-9是空置
同时把cmd的标准输出称之为sout,命令的标准输出称为cout,cout在输出时sout被挂起,但于载体1之间的锁定属性还存在,并被cout继承,cout完成后sout被复位
再看看1>nul 3>nul  1>con 4>con,很明显,在我们自定义句柄转向时,载体会备份所操作的句柄以便复位,例如1>nul,这时载体将1备份至第一个空置句柄,通常是3,当这一行命令处理完成之后,载体打备份句柄3复位了1,而当复合型的转向操作出现时,这种备份还会向后继续,使如1>nul 3>nul,我们操作了1还有3,载体首先将1备分到3上,然后又将3备份到4上,但这第二次备份被更改了,他的设备指向不再是默认的con,而是自定义设备,所以我们需要1>con 4>con这样的方法来恢复,这时载体会认为1>con(其实1>任何设备都可以,例如1>nul)是一个转向操作,其实的确是一个转向操作,它会向后备份,这时3已经不再是一个空置句柄(后边说),所以它会直接备份到4上,而4>con被认为也是一个转向操作,这时载体将4备份到5,这个过程中,原来4的默认指向>nul被更改为>con,当这一行命令完成后,由5开始向前恢复,3,4,5逐一被释放,1恢复到默认状态
在微软的句柄人工转移说明中我们可以看到,自定义的句柄转向会复制其属性,在1>nul 3>1.txt这个例子中,句柄3本来被载体借用,复制了标准输出句柄1以及锁定属性,而当我们再自定义句柄3时只是更改了输出目标,而属性是继承自载体备份至1的锁定状态,这时载体又将句柄3备份至了句柄4,但目标设备已经变成了我们自定义的设备,这行命令完成后,这个被修改的备份向前恢复时,到句柄3会出错,因为句柄被自定义后正在使用,恢复被中止,1被挂起,所有输出根据自定义备份在3完成
作者: everest79    时间: 2008-10-19 12:44

谢谢各位评分的朋友,这会我自已看了一遍,发现还有很多不足之处,更重要的是,这么杂乱的格式你们用心看完,很感谢




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