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

[原创] 批处理重定向中的秘密(句柄备份)

[复制链接]
发表于 2014-11-20 15:59:13 | 显示全部楼层
回复 30# CrLf


    代码运行至此后,其实sdtout已经差不多恢复功能了,否则连前的的prompt 信息也不会显示,除了sdtin接收输入的字符能被显示出来,标准输出都不会显示,显然这里还可以继续显示其它信息的。

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 你是对的

查看全部评分

发表于 2014-11-21 10:01:37 | 显示全部楼层
amwfjhh推测的挺有道理
一个简单的测试
cls > con
在DOS下执行清屏
在CMD下输出字符
这说明cmd仿真出来的con
并不是原始的控制台设备
对屏幕缓冲区的处理没有做到完全仿真
也就是在cmd下con设备更加的“字符化”了

类似的现象还有
dir | more > con
发表于 2014-11-21 15:46:20 | 显示全部楼层
有趣,新发现
发表于 2016-2-19 14:54:01 | 显示全部楼层
RE: 重定向中的秘密(句柄备份) [修改]
发表于 2018-8-31 00:57:32 | 显示全部楼层
绕晕了,大概理解了句柄备份和复原
发表于 2020-12-17 21:29:42 | 显示全部楼层
0 是 stdin
1 是 stdout
2 是 stderr
写的很清楚,谢谢~
发表于 2021-10-10 17:25:40 | 显示全部楼层
学习学习,看看是什么
发表于 2021-10-13 14:53:14 | 显示全部楼层
看了多次,好像有点明白的样子,但不清爽。不知如何使用,应用的例子太少,再来一遍吧,第5遍了。俗话说书读五遍,其义自见。
发表于 2021-11-21 22:27:18 | 显示全部楼层
关于两句应用的个人理解:
应用
1,一次性屏蔽错误输出(加在开始屏蔽的语句后面)
2>nul 3>nul

                         1con 2con 3空
2>nul                1con 2nul 3con
3>nul                1con 2nul 3nul 4con
取回2找3,3找4     1con 2nul 3con

2,一次性将输出写入文件 a.txt(不包括错误反馈,用法同上)
>&3 3>a.txt

                        1con 2con 3空
>&3即1>&3       1con 2con 3con
3>a.txt             1con 2con 3a.txt 4con
取回1找3,3找4    1a.txt 2con 3con 4空
发表于 2023-4-25 15:30:37 | 显示全部楼层
正常情况:
  1. abc
复制代码
输出如下:
  1. 'abc' 不是内部或外部命令,也不是可运行的程序
  2. 或批处理文件。
复制代码
当使用句柄复制:
  1. abc 3>nul 2>&3
复制代码
此时控制台没有输入错误
所以我推测,2>&3,先从 句柄3中取到3的指向(输出设备)。然后让句柄2 也指向 句柄3的指向,即句柄2 此时的输出设备也变为nul.
发表于 2023-4-25 15:39:01 | 显示全部楼层
至于 <& ,
正常输入是这样的
  1. set /p name=输入
复制代码
控制台敲完指令后,我们输入haoren,然后再输入命令
  1. echo %name%
复制代码
控制台会显示haoren
使用 <& 是这样的
  1. set /p p=输入 3<a.txt 0<&3
复制代码
此时 控制台并不需要我们输入,我们接着敲命令
  1. echo %p%
复制代码
控制台显示的是a.txt中的第一行的内容。
由此对0<&3我们可以理解为:0句柄默认的输入设备是控制台,0<&3之后,将句柄3中的输入设备 给 句柄0. 而句柄3的输入设备我们提前设置为a.txt,所以 句柄0的输入设备就是a.txt了。
发表于 2023-4-25 15:48:09 | 显示全部楼层
总结如下:
1>a.txt   将句柄1的输出设备变为a.txt,之前输入到控制台的内容会写入到a.txt
0<a.txt   将句柄0的输出设备变为a.txt,之前需要从控制台输入内容,现在直接将a.txt中的第一行作为输入的内容
1>&3     将句柄3的输出设备作为句柄1的输出设备(&3,取到句柄3的输出设备。 如3>a.txt  1>&3  可以理解成1>a.txt)
0<&3    将句柄3的输入设备作为句柄1的输入设备(&3,取到句柄3的输入设备。 如3<a.txt  0<&3  可以理解成0<a.txt)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:28 , Processed in 0.023873 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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