[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
mark  用于以后学习查询
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

如上图,为什么执行了楼主的代码后清不了屏了??
如何还原?

TOP

我不想发灌水贴,但我不会啊,学习了

TOP

回复 9# 随风


   哈哈 他是研究生

TOP

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

TOP

云里雾里
又让我想起了批处理物理实验。。。

句柄是什么玩意,刚接触bat的时候就听说,从来没研究过。。。

C函数就那么几个,,,句柄理论的到底是建立在什么基础之上。。。

莫在浮上上面筑高台。。。

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

在自己对句柄操作的理解基础上
编写了以下句柄操作模拟代码
大家可以在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

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

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

TOP

讨论了这么多
我就一个问题不明白

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

dir j >nul 2>&1

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

谁能知道过程有何不同?

TOP

i do try

1>&3 3>nul
1、1指向要变,先备份到3,于是3为con,然后1的指向为3的指向,即1也为con,此步结束1为con,3也为con
2、3要变,先备份4为con,然后3为nul,此步结束3为nul,4为con
小结:1--con    3---nul  4---con
3、程序结束后,1取3,3取4。    1--nul,3---con,4--空
句柄可理解成指针!
不知对否?

TOP

回复 17楼 的帖子(是没什么不同,只是说法不一样)

OK

1>&3 3>nul
一、发现 1 的指向要设成 3 的指向,先备份 1 的指向 con 到 3,
二、这时 3 指向 con,已经备份完了,1 再指向新的 con(3 的 con);

三、要设定 3 指向 nul,原来已经有指向了,先备份到下一个无指向的 4,
四、这时 4 指向 con,3 设成 nul 指向。
五、执行时 1 指向 con,3 指向 nul,4 指向 con。

所以在这里会等同于 "1>con 3>nul"。

返回时我们解释相同

TOP

回复 16楼 的帖子

没发现有什么不同。
这样吧,帮我用你的方法解释一下这句
1>&3 3>nul

[ 本帖最后由 xzyx 于 2008-11-19 15:48 编辑 ]

TOP

回复 14楼 的帖子

我以为你说(空)也要备份呢,我顶楼说的也是不要备份阿。

还有,我这儿句柄复制的解释有点不一样
1>&3
一、发现 1 的指向要设置,备份其指向 con 到 3,接着 1 指向设成 3 的指向 con;
  (1>&3 我的理解是 1 指向设定成 3 的指向)
  (复制 3 到 1 只是其相等的说法而已)
二、执行时 1 指向 con,3 指向 con;
三、返回时 1 取回 3 的指向 con,3 恢复(空)。

TOP

例四应该这样解释:
第一步:系统发现1的指向要改变,因此将其指向con备份到3中,此时3的指向就是con。
第二步:系统发现<&符号,这样就把3的指向复制给1,由于3的指向是con,故1的指向仍为con。
第三步:3>nul,系统发现3的指向要改变,因此将3的指向备份到4然后把3指向nul,这样3就指向nul、4指向con。
第四步:上面的语句结束之后系统要恢复这些句柄代码的指向,1找3,3找4,结果是1指向nul、3指向con。

TOP

返回列表