[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
讨论了这么多
我就一个问题不明白

>& 与 <& 到底有什么不同?

dir j >nul 2>&1

dir j >nul 2<&1
结果并无不同

谁能知道过程有何不同?

TOP

另外,反驳一下这句
如果当前状态下 3 - 9 这七个句柄都有了指向,这时新设置的句柄其原指向将不再备份。

这个不太可能
如果是这样
那么当句柄3~9都被赋值为非空后
再重定向其它句柄会无法获取原来的默认值
而这经测试是有问题的

TOP

在自己对句柄操作的理解基础上
编写了以下句柄操作模拟代码
大家可以在cmd中挂参数多次运行模拟
看是否符合实际句柄操作后的结果

那么如何判断一个句柄的指向呢
echo 1<&要判定的句柄号 is con
如果显示 con ,那么句柄值为con
否则为nul或者文件
  1. :: 句柄模拟.cmd - 模拟运算句柄操作后的句柄状态
  2. :: qzwqzw - 2009-6-12
  3. @echo off & setlocal EnableDelayedExpansion
  4. if [%1]==[] (
  5.     echo. 这是句柄操作示例, 模拟运算进行几次句柄操作后的句柄状态
  6.     echo --------------------- call %~n0 "1>&2" "3>nul" ---------------------
  7.     call %0 "1>&2" "3>nul" >nul
  8.     set 句柄
  9.     echo.
  10.     echo --------------------- call %~n0 "1>&2" "4>file1.txt" ---------------------
  11.     call %0 "1>&2" "4>file1.txt" >nul
  12.     set 句柄
  13.     echo.
  14.     echo --------------------- call %~n0 "1>&2" "5>con" ---------------------
  15.     call %0 "1>&2" "5>con" >nul
  16.     set 句柄
  17.     echo.
  18.     pause
  19.     goto :eof
  20. )
  21. set "0=con" & set "1=con" & set "2=con"
  22. for %%h in (%句柄%) do set %%h
  23. echo.----- 起始状态 Initiation state -----
  24. for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
  25. echo.
  26. echo.----- 预处理 Pre-process -----
  27. :loop
  28. if [%1]==[] goto :end
  29. echo.----- %1 -------
  30. set "_tmp=%~1"
  31. set _句柄=%_tmp:~0,1%
  32. set _句柄_2=
  33. set _dev=
  34. if "%_tmp:~2,1%"=="&" (set _句柄_2=%_tmp:~3%) else (set _dev=%_tmp:~2%)
  35. for %%h in (0 1 2 3 4 5 6 7 8 9) do (
  36.     if "!%%h!"=="" (
  37.         set/p=b: %_句柄%[!%_句柄%!]=^>%%h[!%%h!] : <nul
  38.         set "%%h=!%_句柄%!"
  39.         set bak_%%h=%_句柄%
  40.         goto :set
  41.     )
  42. )
  43. :set
  44. for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
  45. echo.
  46. if defined _dev (
  47.     set/p=a: %_dev%=^>%_句柄%[!%_句柄%!] : <nul
  48.     set %_句柄%=%_dev%
  49. ) else if defined _句柄_2 (
  50.     set/p=a: %_句柄_2%[!%_句柄_2%!]=^>%_句柄%[!%_句柄%!] : <nul
  51.     set %_句柄%=!%_句柄_2%!
  52. )
  53. for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
  54. echo.
  55. shift
  56. goto :loop
  57. :end
  58. echo.----- 后处理 Post-process -----
  59. for %%h in (0 1 2 3 4 5 6 7 8 9) do (
  60.     if not "!bak_%%h!"=="" (
  61.         set/p=r: !bak_%%h![]^<=%%h[!%%h!] : <nul
  62.         set !bak_%%h!=!%%h!
  63.         set %%h=
  64.         set bak_%%h=
  65.         for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
  66.         echo.
  67.     )
  68. )
  69. set 句柄=
  70. for %%h in (0 1 2 3 4 5 6 7 8 9) do set 句柄=!句柄! "%%h=!%%h!"
  71. endlocal & set 句柄=%句柄%
  72. echo.----- 结束状态 End Status -----
  73. for %%h in (%句柄%) do set/p=%%~h <nul
  74. echo.
复制代码

[ 本帖最后由 qzwqzw 于 2009-6-14 08:02 编辑 ]

TOP

现在已基本弄清楚<& 与 >& 的差别
它们的主要区别在于默认句柄的不同
<&5 默认是 0<&5
>&5 默认是 1>&5
这与重定向的默认句柄是一致的
因为句柄通常用的就是0,1,2三个
所以这个默认值是经常会用到的

但是因为句柄复制目前发现的唯一作用
是将错误输出与标准输出都重定向的一个文件中
而在这个用途下
>output.txt 2>&1
>output.txt 2<&1
是没有区别的

句柄除了文件指向之外还具有读写属性
句柄0只读,句柄1只写
其它可读可写
但在一个时刻只能有一种属性
这个属性由重定向符号决定
重定向文件不仅复制文件指向
也设置了句柄的读写属性
重定向输入<设置为只读
重定向输出>设置为只写
复制句柄也是类似
<&设置为只读
>&设置为只写
如果同时设置一个句柄
只有最后一个是有效的
比如date 5>test1.log 5>test2.log 5>test3.log 1>&5将输入test3.log


date 5<test.txt >&5
天的白色影子

TOP

这里最难理解的其实是
句柄复制过程中由于备份需要所产生“脏句柄”
理解了“脏句柄”则句柄备份的细节就豁然贯通了
天的白色影子

TOP

amwfjhh推测的挺有道理
一个简单的测试
cls > con
在DOS下执行清屏
在CMD下输出字符
这说明cmd仿真出来的con
并不是原始的控制台设备
对屏幕缓冲区的处理没有做到完全仿真
也就是在cmd下con设备更加的“字符化”了

类似的现象还有
dir | more > con
天的白色影子

TOP

返回列表