[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

评分人数

天的白色影子

25# batman


汗,plp兄的话题激起了我的兴趣,光顾着讨论,没顾及楼主的感受,sorry...

TOP

27# qzwqzw
应楼主的要求,每人扣除1000分。。。

呵呵,先记着(缓期执行)。。。

两位兄弟研究的热情和精神让人佩服,但你们是不是也照顾下楼主的感受,另发贴讨论不是更好吗。。。
***共同提高***

TOP

我原来以为是for /f 的嵌套输出没有按预期输出,是不是和什么句柄有关。。。所以发了那样的疑问。。。

后面验证时和括号匹配有关。。。

遂把自己对for的理解一块放这里,好作为一个思考连贯的过程。。。

在我看来没有什么不会联系到一起的。。。

TOP

本帖最后由 plp626 于 2011-5-25 18:52 编辑

可以这样理解for的二次预处理特性:
for ~ cmd内部的一个类似call的子过程。。。

这个内部子过程有/r /d /f 三个开关,有共同的do in 关键字,一对括号,有最多32个连续单字符名的内置变量
(相对call,若不shift则为10个);

/f 开关有eol,skip,usebackq,delims,tokens,5个关键字,他们作为/f开关的 “第一个参传递”

调用这个子过程的时候,参数分割符同call的参数分隔符;

TOP

原因来自括号匹配:
  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

给空格加转义多此一举,这里主要是括号的原因:
  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

为什么空格在这里就不能再作为参数分割符,而要用逗号,分号或者等号?
  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

那次你那个引号的分隔符。。。
细想了下,还真是预处理的关系:
  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

测试的时候是没加cmd /q /c的,不过有回显,所以发贴的时候就在for内加了cmd /q /c,把它去掉就看到了:
  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

19楼,你测试了否? 我这里照样没法抓到。。

TOP

cmd /q /c for /f %a in ('"for /f %a in ('echo 5678')do echo %a"')do echo %a多了一层就抓不到,这是怎么回事:cmd /q /c for /f %a in ('"for /f %a in ('"for /f %a in ('echo 1234')do echo %a"')do echo %a"' ...
plp626 发表于 2011-5-25 16:53
  1. cmd /q /c for /f %a in ('"cmd /q /c for /f %a in ('for^ /f^ %a^ in^ ('echo^ 1234'^)do^ echo^ %a')do echo %a"') do echo %a
复制代码

TOP

14# qzwqzw


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

TOP

15# plp626


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

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

返回列表