[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 CrLf 于 2012-3-22 23:39 编辑
  1. (echo flag1 | echo flag2) > con
复制代码
什么情况,这句在我电脑上似乎也出现了内存泄露?win7 系统,求验证及解答
另外,我觉得楼主对重定向符的优先级验证不严谨吧,应该这样证明:
  1. set =|find /c "" 2>nul
  2. (set =|find /c "") 2>nul
  3. set = 2>nul|find /c ""
复制代码

TOP

回复 4# plp626


    显示是这样的,多显示了两个没见过的字符。话说让我吃惊的是,执行到这里时居然惊动了 360:
   
    而我电脑上的 0x0~0xff 应显示为:
   
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

本帖最后由 CrLf 于 2012-3-23 16:23 编辑

回复 6# qzwqzw


噢,果然如此,写成这样和 dir 的结果一比较就很明显了:
  1. (echo;|dir)>con
复制代码
但是不知为何会因为重定向而导致回车换行符显现真身呢?08、09 确实试出来了,但是不知其所以然
  1. (echo;|set /p= )>con
  2. rem 长串空格为一个 tab 制表符
复制代码

TOP

话说句柄默认输出就是标准设备,那么可以这样:
  1. (cls 1>&2)>nul
  2. pause
  3. (cls 1>&3)>nul
  4. pause
复制代码
测试中从句柄 4 开始都不能放在 >& 之后,会报这个错误:
  1. 重定向句柄 N 时,
  2. 无法复制此句柄。
复制代码

TOP

猜测句柄 4~9 的初始值不是有效句柄
做了一个测试试图证明当初始句柄不是有效句柄时,产生的备份句柄会保留,却得到了奇怪的结果:


A、测试中 3 和 4 为备份句柄:
3=1,4=2
而结束备份后句柄 4 仍无效
  1. echo test >nul 2>nul
  2. echo 无效句柄 1>&4 2>con
复制代码
B、
测试中 3、4、5 为备份句柄:
3=1,4=2,5=3
结束备份后句柄 4 变成 3 所备份的状态
  1. echo test >nul 2>nul 3>nul
  2. echo 变成句柄3(nul) 1>&4 2>con
复制代码
  1. echo test >nul 2>nul 3>con
  2. echo 变成句柄3(con) 1>&4 2>con
复制代码
C、
测试中 3、4、5 为备份句柄:
3=1,4=2,5=3
结束备份后句柄 4 变成 nul
既不是 3 也不是 2,违背测试 C 体现的规律
  1. echo test >nul 2>&1 3>&1
  2. echo 变成 nul 1>&4 2>con
复制代码
D、
这两个测试中 3、4、5 为备份句柄:
3=1,4=2,5=3
结束备份后句柄 4 变成 1 的原始状态
  1. echo test >nul 3>nul 4>nul
  2. echo 正确 1>&4 2>con
复制代码
E、
这两个测试中 4、5 为备份句柄:
4=3,5=4
结束备份后句柄 4 仍是无效句柄
  1. echo test 3>nul 4>nul
  2. echo 错误 1>&4 2>con
复制代码

TOP

有人能看出 16 楼测试结果的隐含规律吗?

TOP

本帖最后由 CrLf 于 2014-11-28 20:26 编辑

发现前面的说法有误,比较以下三个测试:
  1. dir 4>&3
复制代码
  1. dir >nul 4>&3
复制代码
  1. dir 1>&3
复制代码
看来句柄 3~9 的初始状态都是无效句柄
是先发生备份(想过去这也是理所当然的),句柄 3 保存了句柄 1 的值,再执行了 1>&3,把句柄 3 的值借给句柄 1,命令执行完毕后,句柄 3 把备份还给句柄 1,所以看起来句柄 3 仿佛默认等于句柄 1 的初始状态

TOP

回复 20# amwfjhh
  1. (echo,|echo,)>con 1>&3
复制代码
相同句柄的重定向只以最后一次为准,经过预处理,这里实际执行的重定向只有 1>&3,而句柄 3 是句柄 1 的备份,所以句柄 1 的重定向结果还是原来的句柄 1

TOP

返回列表