批处理之家's Archiver

wxcute 发表于 2008-11-18 17:44

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

[quote]看了 [ 小竹英雄 ] 的 “重定向中的秘密” 一文,搞得我云里雾里,真就是那饭桌上的美食转哪转——晕菜了。
所以写此文与各位看看,有什么不对的地方请大家指正。[/quote]

重定向是指使用重定向符号对输入或输出位置进行重新指定。
[quote][color=Blue]以下是理论说明,懂的可以跳过,也可以先看例子,遇到不明白的再倒回来看。[/color]
重定向符号有 < 、> 、>> 、<& 、>& 和 | 共六个。

[color=Magenta]重定向符号[/color]的作用如下表所示:

符号   作用
——————————————————————————————
<   从文件或设备(如默认的 con 键盘)中读取命令输入。
>   将命令输出写入到文件或设备(如 prn 打印机)中。
>>   将命令输出添加到文件末尾而不删除文件中的信息。
<&  从后一个句柄读取输入并写入到前一个句柄输出中。
>&  将前一个句柄的输出写成后一个句柄的输入。
|   读取前一个命令中的输出作为后一个命令的输入。也称作管道符。
——————————————————————————————
注意:句柄的输入输出只是其指向,真正的输入输出是靠设备。
重定向符号的默认句柄,< 的默认句柄是 0,> 的默认句柄是 1。

可用[color=Magenta]句柄[/color](0 - 9)如下表:

句柄    句柄号   说明
——————————————————————————————
STDIN    0     标准输入,默认从键盘输入
STDOUT   1    标准输出,默认输出到命令提示符窗口
STDERR   2       标准错误输出,默认输出到命令提示符窗口
UNDEFINED 3-9     这些句柄由应用程序和各个具体工具单独定义。
——————————————————————————————
STD 即 Standard —— 标准的缩写。

[color=Magenta]设备[/color]
标准输入设备为键盘,用 con 表示。
标准输出设备为控制台(即命令提示符),默认也用 con 表示。
常用的还有:
空设备,用 nul 表示。
存储设备,文件就归到这类。
不常用的如:打印机 prn。

[color=Magenta]指向[/color]
句柄实际上也是一组 0 1 数据,是存储了一个指向。
句柄 0 默认指向 con,这里 con 为标准输入设备,即键盘。
句柄 1 默认指向 con,这里 con 为标准输出设备,即控制台。
句柄 2 默认也指向 con,同 1。
此外,我们对句柄的指向重新设定(即所谓的重定向)时,可以改变句柄的指向。
如 1>nul 是让“标准输出”数据输出到空设备,效果就是屏蔽输出。
特别之处: 3 - 9 默认是没有指向的,我们可以用(空)来表示,注意是不同于空设备 nul 的哦![/quote]

(图示)

下面拿个[u]简单的例子[/u]来说明
[b]pause>nul[/b]
后面的 >nul 的作用就是屏蔽了 pause 命令的默认输出 “请按任意键继续. . .”。
以上是简单的描述,而实际的过程可没那么简单:
首先确定重定向符号为 >;
接着检查句柄号,发现没有,控制台为其加上默认句柄 1,此时变成 pause 1>nul;
由于句柄 1 的默认指向 con,此时要被临时设定为指向 nul,为了之后取回原来的指向,所以要先对 1 的指向进行备份,备份到句柄 3,备份过后临时设定 1 指向 nul;
(为什么要备份,为什么要备份到 3 而不是 4?见下文)
到这时这条语句才被执行,效果就是批处理暂停,没有输出只有一个光标闪阿闪。
执行完后 1 要取回原来的指向,1 的指向在上面被备份到 3,不管 3 的指向有没有改变 1 要取回它的指向来,取回后 1 指向 con;3 的指向被取走,由于 3 没有备份,所以恢复到原来的(空),即无指向。
至此整个过程描述完毕。
可以发现这时的情况与最初是相同的,所有句柄的指向都是其默认值。

  接着引出 [b]句柄(指向)备份理论[/b]。
[color=RoyalBlue][code]当指向为非空的句柄被重新设置时要进行备份,而且是备份到第一个没有指向的句柄。
语句运行完后要取回其备份,而不管备份中的句柄指向有没有改变。
如果当前状态下 3 - 9 这七个句柄都有了指向,这时新设置的句柄其原指向将不再备份。[/code][/color][code]另一种表述:也就是说当指向为(空)的句柄被设定时是不需要备份的。如:复制句柄时源句柄不备份,因为没有被再次设置。
补充说明:一个句柄只能存储一个指向。[/code]举例说明:
[attach]601[/attach]
[attach]602[/attach]
示例三与示例二有什么异同呢?
基本上相同,只有执行的这句,示例三是有输出的,示例二却没有。
[attach]603[/attach]
有没有发现示例四和示例三是一样的,那用复制句柄的方法能不能和示例二一样呢?
可以,自己想吧。^_^

还有一个[color=Green][b][u]特别的例子[/u][/b][/color]:
echo 你好!>nul >hello.txt >prn >con
它使用的是相同的句柄 1,这时要以最后一个为准,其他的忽略。把它存为批处理运行,能够清楚的看到前面的三种指向直接被剪掉了。
同理:
echo 你好! 1<&3 >nul
也以后面的 ”>nul“ 为准,即不显示 ”你好!“。

[color=DarkOrchid][b][u]具体例子讲解[/u][/b][/color][code]@echo off
echo 哇,这就是传说中的树叶吗?>con 3>nul
echo 我有一片神奇的树叶(吹口哨),
echo 你看不见我,
echo 我现身,>con
echo 我又隐身啦。
echo 谁偷了我的叶子,快还我。>con 4>con
echo 没穿裤裤被你们看到了!
pause>nul[/code][color=red]哇,这就是传说中的树叶吗?[/color]
这句用了 “>con >nul” 同示例三,首先 句柄 1 指向要被设为 con,先备份到 3 再设定;第二步 这时 3 指向为 con,现在又要设为 nul,先备份 con 到 4;最后 1 指向 con,3 指向 nul,4 指向 con;所以这句执行时是要显示的。
执行完后返回,1 取回 3 的指向 nul,3 取回 4 的指向 con,4 恢复(空),所以返回结束时 1 指向 nul,3 指向 con。假设这时状态为 A。
因此接下来两句 “[color=red][color=RoyalBlue]我有一片神奇的树叶(吹口哨)[/color][/color],”,“[color=red][color=RoyalBlue]你看不见我,[/color][/color]” 是不显示的。
“[color=red]我现身,[/color]” 这句设定为 “>con”。执行时 1 为 con,原来的 nul 备份到 4(因为前面 3 已经为 con 不是没有指向了);执行完后 1 取回备份 nul,4 恢复(空)。这时的状态还是 A。
所以下一句 “[color=red][color=RoyalBlue]我又隐身啦。[/color][/color]” 还是不显示。
倒数第二句 “[color=red]谁偷了我的叶子,快还我。[/color]”
设定为 “>con 4>con”,首先 句柄 1 指向要被设为 con,3 已经不为(空)了,所以备份 nul 到 4;第二步 这时 4 指向为 nul,现在又要设为 con,先备份 nul 到 5;最后 1 指向 con(3 指向 nul)4 指向 con,5 指向 nul;所以这句显示。
返回时 1 取回 4 的指向 con,4 取回 5 的指向 nul,5 恢复(空)。而这时状态已经不同于 A 了,设为状态 B。最后一句 “[color=Red]没穿裤裤被你们看到了![/color]” 使用的是状态 B 的句柄指向,所以也显示。

到些讲解结束。(以上[color=Red]红色为显示的[/color],[color=RoyalBlue]淡蓝色为不显示的[/color])

如果要用处理来表示就是这样
[attach]604[/attach]

[color=DarkOrchid][b][u]补充[/u][/b][/color]
我们可以比较一下下面两句的差别
echo 你好!>con 2>con
echo 你好!
([i]有人会问了 “你不是说句柄 1 和 2 默认指向为 con 吗?”[/i])
没错,我来解释一下。
第一句对句柄 1 和 2 进行了重新设定(虽然是和默认一样的),因此要有备份和取回的过程;
而第二句没有设定,直接取默认值作为当前设定(不需要备份什么的哦);
这样第二句就比第一句快一点,如果在一个循环多次的程序中使用,速度差别就很明显了。

[color=Blue][b][u]应用[/u][/b][/color]
[u]一次性屏蔽错误输出[/u](加在开始屏蔽的语句后面)
2>nul 3>nul

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

[size=2]  此帖中就有应用(是一次性屏蔽错误输出的,大大加快了程序的运行速度)
  [url=http://bbs.bathome.net/viewthread.php?tid=2372&page=1#pid14024]http://bbs.bathome.net/viewthread.php?tid=2372&page=1#pid14024[/url][/size]

[color=Teal][b]以上一些个不实用的东西大家没必要深究,了解了解就行了,应用为上嘛。[/b][/color]
[color=Teal][b]实在需要研究的人例外。[/b][/color]

问题:经过重定向后句柄的指向已经不同于默认指向了,还能恢复成原来的默认指向吗?
回答:因为指向不能设定或复制成空,所以语句运行完后的指向如果改变了是不能回到默认指向的。
(如有错误,欢迎指出。)
[quote]参考《命令行参考》,为方便说明,部分内容摘自其中。
英雄兄的 “重定向中的秘密”,由于其中没有关于备份条件的说明,且有一些错误,容易搞得人一头雾水。英雄兄说他帖子写得快吐血,我是看他帖子看得快吐血。
以上为个人观点,信则是不信则非。
还有不会做图,否则做个GIF就更形象了。
英雄的帖子链接
[url=http://bbs.verybat.org/thread-9271-1-1.html]http://bbs.verybat.org/thread-9271-1-1.html[/url]
[url=http://bbs.verybat.org/thread-9744-1-1.html]http://bbs.verybat.org/thread-9744-1-1.html[/url][/quote]

BBCC 发表于 2008-11-18 19:21

占个沙发先,谢谢LZ的分享!

BBCC 发表于 2008-11-18 19:49

“我现身,”这句设定为“>con”。执行时 1 为 con,原来的 nul 备份到 4(因为前面 3 已经为 con 不是没有指向了);执行完后 1 取回备份 nul,4 恢复(空)。这时的状态还是 A。

-----------------------------------------
回复:兄的意思是将1原来的nul备份到3,然后将3的con备份到4吧?
最后结束再依次取回?

wxcute 发表于 2008-11-18 20:04

回复 3楼 的帖子

不是
状态 A:
1nul 3con(4 之后都没有指向)
echo 我现身>con
┏>con
┗1con(3con)4nul    设定句柄 1 指向为 con,先备份句柄 1 的原指向(状态 A 的指向)nul 到句柄 4;
执行→1con(3con)4nul  句柄 4 指向是由(空)变成 nul,因此不备份。
   ┌────────┘
←取回1nul(3con)    句柄 1 取回其在 4 的备份 nul;
             句柄 4 因为没备份,因此恢复到默认的无指向状态。

句柄 3 因为在 >con >nul 这句中设定了,返回后成为状态 A:1 nul 3con;到这儿 3 已经不是(空)了
所以 >con 备份时就没 3 什么事儿了,直接备份到 4。

=======================================
请看句柄备份理论第一句
[color=RoyalBlue]当指向为非空的句柄被重新设置时要进行备份,而且是备份到第一个没有指向的句柄。[/color]

[[i] 本帖最后由 wxcute 于 2008-11-18 20:05 编辑 [/i]]

BBCC 发表于 2008-11-18 20:09

ok,原理就是将1的备份到3中,如果3不为空,就向后推移?

wxcute 发表于 2008-11-18 20:14

回复 上面,差不多

看 [b]指向[/b] 部分,有说明 0-9 这10 个句柄的默认指向。
[quote]
指向
句柄实际上也是一组 0 1 数据,是存储了一个指向。
句柄 0 默认指向 con,这里 con 为标准输入设备,即键盘。
句柄 1 默认指向 con,这里 con 为标准输出设备,即控制台。
句柄 2 默认也指向 con,同 1。
此外,我们对句柄的指向重新设定(即所谓的重定向)时,可以改变句柄的指向。
如 1>nul 是让“标准输出”数据输出到空设备,效果就是屏蔽输出。
特别之处: 3 - 9 默认是没有指向的,我们可以用(空)来表示,注意是不同于空设备 nul 的哦![/quote]

[[i] 本帖最后由 wxcute 于 2008-11-18 20:15 编辑 [/i]]

BBCC 发表于 2008-11-18 20:17

问个题外话,这些设备问题都是怎样去研究其原理的?

wxcute 发表于 2008-11-18 20:51

回复 7楼 的帖子

我手头也没什么资料,全靠反推。

过程大致如下:
先研究这些单个的输出现象
echo a>nul
echo a 2>nul
echo a 3>nul
echo a 4>nul
echo a 5>nul
echo a 6>nul
echo a 7>nul
echo a 8>nul
echo a 9>nul
echo a>nul 2>nul
echo a>nul 3>nul
echo a>nul 4>nul
echo a>nul 5>nul
……
再组合起来看有什么表现

懂得部分后用以下的来检查看不到效果的句柄。
echo a 1<&a
echo a 1<&9
echo a 1<&8
echo a 1<&7
echo a 1<&6
echo a 1<&5
echo a 1<&4
echo a 1<&3
echo a 1<&2
echo a 1<&1
echo a 1<&0

总之是一点点的推,有些认为肯定是对的了后就作个假设并拿来验证其他的;
但有时这种假设是错的,就要推翻重新假设。
一步步推到没错后就得出来。

随风 发表于 2008-11-18 21:21

楼主的研究精神真是可赞可佩,“英雄”的这片教程我也是看的一头雾水,通常我只是在要用时才研究研究。。。汗。。。

wxcute 发表于 2008-11-19 10:14

回复 10楼 的帖子

谢谢你的提醒,确实是忘了写应用部分了,马上补上。

xzyx 发表于 2008-11-19 12:25

re:楼主

很高兴还有人对我那篇又臭又长的文章感兴趣。

我们这里提到的数据流(包括标准输出流、标准输入流、标准错误流)由句柄stdout、stdin、stderr代替,而这三个句柄又由三个句柄号码代替,即1、0、2。也就是说1代表标准输出流、0代表标准输入流、2代表标准错误流。3~9没有指代任何数据流(视为“空流”)。所谓重定向,就是把数据流从默认位置重定向到指定位置,而3~9仅仅是保存指向的间接量(因为它们里面根本不会有数据流)。

“空指向”是否也会被“备份”这点我觉得没必要讨论,因为效果都是一样的。

我要说的重点是——除了3~9意外其实还有两个额外的“空间”来存储“指向”,这样就可以在占满的情况下备份8和9的指向。

[[i] 本帖最后由 xzyx 于 2008-11-19 12:29 编辑 [/i]]

wxcute 发表于 2008-11-19 12:53

回复 12楼 的帖子

英雄兄也来看阿。多谢多谢

现在觉得我的也很容易把人绕晕。(叹口气)

占满部分倒是没研究透。有空看看。

“空指向” 备不备份是有区别的

>nul 3>nul 4>nul

>nul 4>nul 5>nul
是不一样的,虽然没什么用处

xzyx 发表于 2008-11-19 13:54

>nul 3>nul 4>nul

>nul 4>nul 5>nul
明显不一样,但与“空指向” 备不备份没有直接关系。

我举个例子
@echo off
echo hero >nul 4>nul 5>nul
echo yeah 1>&4
pause
这里会出现句柄复制的错误,即4是空指向。如果空指向也备份的话,那么4应该到5中找指向,这样4就应该有指向。因此“空指向” 不备份。

xzyx 发表于 2008-11-19 14:09

例四应该这样解释:
第一步:系统发现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。

wxcute 发表于 2008-11-19 15:03

回复 14楼 的帖子

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

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

xzyx 发表于 2008-11-19 15:45

回复 16楼 的帖子

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

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

wxcute 发表于 2008-11-19 16:03

回复 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"。

返回时我们解释相同

curious 发表于 2009-4-22 13:34

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--空
句柄可理解成指针!
不知对否?

qzwqzw 发表于 2009-6-12 18:50

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

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

dir j >nul 2>&1

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

谁能知道过程有何不同?

qzwqzw 发表于 2009-6-12 18:54

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

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

qzwqzw 发表于 2009-6-12 22:42

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

那么如何判断一个句柄的指向呢
echo 1<&要判定的句柄号 is con
如果显示 con ,那么句柄值为con
否则为nul或者文件
[code]:: 句柄模拟.cmd - 模拟运算句柄操作后的句柄状态
:: qzwqzw - 2009-6-12
@echo off & setlocal EnableDelayedExpansion
if [%1]==[] (
    echo. 这是句柄操作示例, 模拟运算进行几次句柄操作后的句柄状态
    echo --------------------- call %~n0 "1>&2" "3>nul" ---------------------
    call %0 "1>&2" "3>nul" >nul
    set 句柄
    echo.
    echo --------------------- call %~n0 "1>&2" "4>file1.txt" ---------------------
    call %0 "1>&2" "4>file1.txt" >nul
    set 句柄
    echo.
    echo --------------------- call %~n0 "1>&2" "5>con" ---------------------
    call %0 "1>&2" "5>con" >nul
    set 句柄
    echo.
    pause
    goto :eof
)
set "0=con" & set "1=con" & set "2=con"
for %%h in (%句柄%) do set %%h
echo.----- 起始状态 Initiation state -----
for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
echo.

echo.----- 预处理 Pre-process -----
:loop
if [%1]==[] goto :end
echo.----- %1 -------
set "_tmp=%~1"
set _句柄=%_tmp:~0,1%
set _句柄_2=
set _dev=
if "%_tmp:~2,1%"=="&" (set _句柄_2=%_tmp:~3%) else (set _dev=%_tmp:~2%)
for %%h in (0 1 2 3 4 5 6 7 8 9) do (
    if "!%%h!"=="" (
        set/p=b: %_句柄%[!%_句柄%!]=^>%%h[!%%h!] : <nul
        set "%%h=!%_句柄%!"
        set bak_%%h=%_句柄%
        goto :set
    )
)
:set
for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
echo.
if defined _dev (
    set/p=a: %_dev%=^>%_句柄%[!%_句柄%!] : <nul
    set %_句柄%=%_dev%
) else if defined _句柄_2 (
    set/p=a: %_句柄_2%[!%_句柄_2%!]=^>%_句柄%[!%_句柄%!] : <nul
    set %_句柄%=!%_句柄_2%!
)
for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
echo.
shift
goto :loop

:end
echo.----- 后处理 Post-process -----
for %%h in (0 1 2 3 4 5 6 7 8 9) do (
    if not "!bak_%%h!"=="" (
        set/p=r: !bak_%%h![]^<=%%h[!%%h!] : <nul
        set !bak_%%h!=!%%h!
        set %%h=
        set bak_%%h=
        for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
        echo.
    )
)
set 句柄=
for %%h in (0 1 2 3 4 5 6 7 8 9) do set 句柄=!句柄! "%%h=!%%h!"
endlocal & set 句柄=%句柄%
echo.----- 结束状态 End Status -----
for %%h in (%句柄%) do set/p=%%~h <nul
echo.[/code]

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

qzwqzw 发表于 2010-5-3 20:18

现在已基本弄清楚<& 与 >& 的差别
它们的主要区别在于默认句柄的不同
<&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

plp626 发表于 2011-5-25 11:03

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

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

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

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

qzwqzw 发表于 2011-5-25 15:31

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

秋风·飞扬 发表于 2012-5-8 12:45

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=15545&ptid=2579]9#[/url] [i]随风[/i] [/b]


   哈哈 他是研究生

wangtao6312 发表于 2012-5-18 11:25

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

919141923 发表于 2013-10-4 22:02

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

ivor 发表于 2013-11-12 13:32

mark  用于以后学习查询

amwfjhh 发表于 2014-11-20 15:22

[quote]如上图,为什么执行了楼主的代码后清不了屏了??
如何还原?
[size=2][color=#999999]919141923 发表于 2013-10-4 22:02[/color] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=138492&ptid=2579][img]http://bbs.bathome.net/images/common/back.gif[/img][/url][/size][/quote]


    只能说此con非彼con了,真正的原始con已被句柄3所使用。可将echo...>con 4>con那句改成echo...>con 4>&3

CrLf 发表于 2014-11-20 15:50

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=157815&ptid=2579]29#[/url] [i]amwfjhh[/i] [/b]


    cls 是输出了一个换页符来实现清屏的,所以如果 StdOut 被指向了 nul...

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.