谢谢willsort的回答,是我理解错误
第一,我将自定义句柄3-9理解为七个可以存储字符的内存空间(抽象),看到你的例子才发现自定义句柄是这样的
rem 定义句柄4输入
4<file.txt
rem 定义句柄4输出
4>file.txt
应当是自定义句柄在使用之前首先应指定设备
第二,看了以上例子才知道句柄的复制与转向是两个相附又相反的概念,例如输入复制及输入转向"<&",拥有输入功能的句柄只有一个就是0
4<file.txt 0<&4
首先定义句柄4,因为是输入所以一定为4<file.txt
1.复制概念是将0的属性复制到4,句柄4拥有了0的输入读取功能
2.而转向概念为4指向0,句柄0以输入读取方式来获得自定义的句柄4
以上两者其实都是句柄4定义的设备代替了键盘输入
第三,那么逻辑得到输出复制及输出转向的概念(这个我们常用)
4>file.txt 1>&4
4>file.txt 2>&4
同样复制概念4拥有了1的输出特性,但4定义了新设备为file.txt,也就代替了正常屏幕输出消息,其实这个更像windows的剪贴功能而非复制,若是复制那么1也应同样有着屏幕输出的功能,为什么会不显示
而转向概念就可以很好的解释这个逻辑故障,因为4所定义的设备file.txt取代了1原有的设备msg print,所以转向概念的延伸大概就是"4>file.txt 1>&4"="1>file.txt"
第四,这里不得不提一下句柄3的特性
:sub1
echo d 1>nul 3>nul
::随意执行命令
echo d 1>con 4>con
::恢复正常
:sub2
find "." d 2>nul 3>nul
::随意执行命令
find "." d 2>con 5>con
这样会发现执行sub1如同每句后边执行了1>nul
而sub2有如每句后边都执行了2>nul
而释放命令为 X>con X+3>con
我可以找到的解释是同时转向中有句柄3,句柄3会挂起一同转向的句柄X,并将其属性赋于3+X,而且指定新设备为nul,同时句柄3生成的新句柄是持久性的,除非同时手工释放X与3+X
句柄3在批处理中的应用
@echo off 2>nul 3>log.txt
find "." dd
as
echo a
echo b 1<&2
pause
在当前窗口没有关闭的情况下,log.txt只读访问
第五,就是我的假设了,不能成立,无法将stdin的输入转向或复制到某个自定义句柄或设备中