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

[文件操作] [分享]批量文本重定向输出的新方案

传统方案不用多说了
老老实实一个Echo一个重定向就可以了

后来发展出的方案则是分组输出
(for /l %%i in (1,1,10000) do echo string)>test1.log
这个方案的优点也不用多说
文件打开次数减少
时间性能有了很大提升

现在有一种新方案
使用二次重定向
cd. >con 3>test2.log
for /l %%i in (1,1,10000) do echo string
cd. >con 4>con

与方案2相比
文件打开次数是一致的
优点是在代码中出现多条输出指令时
不需要进行语句分组
也就不需要过多的预处理和启用变量延迟了

缺点是在一个cmd进程中
同样的方法只能使用一次

只有在关闭cmd进程后文件才会关闭
所以一般需要使用cmd/c新建cmd进程来调用批处理

[ 本帖最后由 qzwqzw 于 2010-5-3 18:01 编辑 ]
1

评分人数

天的白色影子

楼主能说说,  3>*   4>*   是代表什么意思吗?
    ╭╩═╮
╭╯G O ╠ 雁过留声
╰⊙═⊙╯

TOP

重定向中的秘密(句柄备份)
http://www.bathome.net/viewthread.php?tid=2579
天的白色影子

TOP

字看的懂,但意思看不懂
优点和缺点完全不懂,能否讲解一二,我苯
努力学习,努力挣分

TOP

多看,多用,多想
很快你就会明白的

我怕照我的思路说下去
反而让你更加弄不明白
天的白色影子

TOP

多看,多用,多想
很快你就会明白的

说得再明白不去实际操作也很快会忘记的
感谢分享!!!!

[ 本帖最后由 zjw767676 于 2010-5-4 14:43 编辑 ]
有一种爱叫放弃

TOP

本帖最后由 plp626 于 2011-5-25 11:47 编辑

以上两贴摘自:
http://baike.baidu.com/view/194921.htm
windows编程,俺真不懂。。。

=================================
如何生成控制台重定向标准的句柄的进程

http://support.microsoft.com/kb/190351

TOP

本帖最后由 qzwqzw 于 2011-5-25 11:52 编辑

把老帖翻出来供自己学习
楼上好无良啊 ^_^

句柄的理解不需要那么复杂
cmd缺省具有10个可供I/O的句柄
可以理解为10个可以存放I/O文件或者设备地址的空间
从0到9依次编号

句柄0-2大量地被命令行程序用来输入输出信息
他们都缺省存放控制台设备con的地址
con可以理解为当前的命令行窗口
但它们的读写属性有所差异
句柄0的别名是标准输入,限定只可读
句柄1的别名是标准输出,限定只可写
句柄2的别名是标准错误,可读可写

句柄3-句柄9缺省是空的,也均可读可写
需要通过重定向或者句柄复制给它们赋值
目前未发现有命令行程序使用句柄3-9进行输入输出
所以这些句柄现在只在句柄备份领域有特殊的应用
天的白色影子

TOP

我觉得与其把>&和<&说成是复制句柄,不如说成是转移句柄,这样就可以解释下面这句为什么无法实现既输出到文本又输出到屏幕了
  1. echo test 3>1.txt 1>&c3
复制代码

TOP

而“真空”句柄无法被转移的特性导致无法将经过句柄备份后的还原为初始状态(非nul的真空状态)
  1. @echo off>con 3>nul
  2. rem 尝试还原句柄3为“真空” 3>nul 5>&4
  3. echo 能看到下一句test吗? >con 3>con
  4. echo test
  5. pause
复制代码

TOP

本帖最后由 qzwqzw 于 2011-5-25 15:29 编辑

12# zm900612
句柄转移的概念模型建立并不理想
echo test 3>1.txt 1>&3
完全可以用句柄复制模型简单解释
1、1.txt赋给句柄3
2、句柄3复制到句柄1
最终结果就是句柄1和句柄3都被赋为1.txt
echo的输出通过句柄1输出到文件1.txt
而句柄3因为echo命令根本不用它输出
所以不会有任何结果上的影响

其实重定向和管道也可以看作是句柄复制的一种特例
重定向是将文件或者IO设备的句柄复制给cmd的保留句柄
管道是将cmd的句柄1(标准输出)复制给句柄0(标准输入)

另外重申和明确一个概念
句柄在cmd中不仅仅是文件和设备的地址
它还包含了一些附加的属性
比如I/O相关的读写属性
所以句柄0是缺省只读的
句柄1是缺省只写的
句柄2是缺省可读可写的
而句柄复制的过程中
不仅复制了句柄中的文件或设备地址信息
也同时复制了包括IO属性在内的附加信息
天的白色影子

TOP

  1. cmd /q /c for /f %a in ('"for /f %a in ('echo 5678')do echo %a"')do echo %a
复制代码
多了一层就抓不到,这是怎么回事:
  1. cmd /q /c for /f %a in ('"for /f %a in ('"for /f %a in ('echo 1234')do echo %a"')do echo %a"')do echo %a
复制代码

TOP

还有这个帖子:http://bathome.net/viewthread.php?tid=9139&highlight=doskey
  1. cd&doskey/history
  2. for /f "delims=" %a in ('doskey/history')do @echo %a
复制代码

TOP

15# plp626


因为这样就有了两对引号,在语句的预处理中出错了

TOP

14# qzwqzw


好吧,我又没把观念扭过来,我原来一直以为句柄重定向的是每个句柄输出的内容,而不是要定向到的设备,昨天老兄已经纠正了这个错误观点,但是我今天又搞混了

TOP

返回列表