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


是每一行前面的第一个字符没有了,顶楼有说。

TOP

本帖最后由 mxxcgzxxx 于 2011-7-20 22:36 编辑
@echo off
setlocal enabledelayedexpansion
(
    for /l %%a in (1 1 10) do (
        pause >nul
        set /p echo=
        echo !echo!
    )
)
tmplinshi 发表于 2011-7-18 10:36


有趣的结果:起头的()被忽略,最后一个P被上一行吃了
所以用这种办法还得小心
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

很好很强大,值得研究
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (
  4.     for /l %%a in (1 1 7) do (
  5.         pause >nul
  6.         set /p echo=
  7.         echo !echo!
  8.     )
  9. ) <%0
  10. pause
复制代码
有点想不通的是,pause 为什么不直接接收 %0 的内容,而要接收它下一行的 set /p。

TOP

本帖最后由 tmplinshi 于 2011-7-18 11:35 编辑

我测试了一个 11651 行的文本(没有空行),结果是 for /f 更快。

测试代码:

set_p.bat:
  1. @echo off
  2. (
  3.     for /l %%a in (1 1 11651) do (
  4.         setlocal enabledelayedexpansion
  5.         set /p str=
  6.         echo,!str: =_!
  7.         endlocal
  8.     )
  9. ) <test.txt >test_1.txt
复制代码
for_f.bat:
  1. @echo off
  2. (
  3.     for /f "delims=" %%a in (test.txt) do (
  4.         set str=%%a
  5.         setlocal enabledelayedexpansion
  6.         echo,!str: =_!
  7.         endlocal
  8.     )
  9. ) >test_2.txt
复制代码
测试结果:
e:\我的文档\桌面>timeit set_p.bat

Version Number:   Windows NT 5.1 (Build 2600)
Exit Time:        10:19 am, Monday, July 18 2011
Elapsed Time:     0:00:15.500
Process Time:     0:00:14.031
System Calls:     430474
Context Switches: 56632
Page Faults:      39304
Bytes Read:       19381026
Bytes Written:    741100
Bytes Other:      2573192

e:\我的文档\桌面>timeit for_f.bat

Version Number:   Windows NT 5.1 (Build 2600)
Exit Time:        10:20 am, Monday, July 18 2011
Elapsed Time:     0:00:12.484
Process Time:     0:00:12.328
System Calls:     159911
Context Switches: 2458
Page Faults:      15433
Bytes Read:       598486
Bytes Written:    597572
Bytes Other:      2345164
1

评分人数

TOP

获取文件行数可以用:
  1. find /c /v ""<1.txt
复制代码
虽然也是外部命令,但是效率比 findstr /n 要高

TOP

不错,有一定的实用性。

例如,再也不用使用 findstr 来保留空行了,只不过要知道文本的行数。示例:
  1. @echo off
  2. set str=
  3. (
  4.     for /l %%a in (1 1 7) do (
  5.         setlocal enabledelayedexpansion
  6.         set /p str=
  7.         if defined str (echo !str!) else echo ---------空行
  8.         endlocal
  9.     )
  10. ) <a.txt
  11. pause
复制代码

TOP

由于楼主的研究精神,于是乎截取文本头几行,或截取文本指定行的问题迎刃而解!
赞一个
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

返回列表