Board logo

标题: 解析改写源文件的批处理代码 [打印本页]

作者: 随风    时间: 2009-4-17 23:24     标题: 解析改写源文件的批处理代码

解析改写源文件的代码
:: @随风 @bbs.bathome.net @2009-04-17
有助于新手进一步理解for的原理。
  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.    if not defined flag (
  4.       echo abcdefg>a.txt
  5.       echo %%a>>a.txt
  6.       set flag=a
  7.     ) else (
  8.       echo %%a>>a.txt
  9.    )
  10. )
  11. pause
复制代码
这是一个改写源文件a.txt的代码,在源文件的第一行插入字符串 abcdefg
解析:
1、for /f "delims=" %%a in (a.txt) do
   当运行了上面一句以后(注意此时还没有运行 do 后面的命令,
   我们可以理解为for已经把a.txt的所有内容以行为单位保存到了内存。
   也可以理解为此时a.txt是否存在或里面的内容是否改变已经不重要了。
2、开始运行do 后面的命令
   后面的命令很简单,其实只有一个 if 。。。else 。。 语句。
    if not defined flag (
      echo abcdefg>a.txt
      echo %%a>>a.txt
      set flag=a

     该命令的意思是当变量flag没有被定义时则运行
      echo abcdefg>a.txt  重定向abcdefg到a.txt并覆盖源内容
      echo %%a>>a.txt     追加%%a到a.txt(此时%%a为源a.txt内容的第一行)
      set flag=a          给变量flag定义,此句给flag定义什么值不重要,主要是给flag定义,以保证下次不再运行上面几句
至此for的第一次循环完毕。
3、当下一次循环时,因为上一次已经运行了 set flag=a
   所以 if 语句不成立,所以会执行 else 后面的命令
   也就是 echo %%a>>a.txt (此时%%a为原a.txt的第二行内容)
   依此类推。。。直到循环全部完成。












.

[ 本帖最后由 随风 于 2009-4-17 23:30 编辑 ]
作者: batman    时间: 2009-4-17 23:32

楼上有个小错误:应该是for /f  "delims=" %%a in ('type a.txt')吧。
-------------------------------------------------------------------------------
经测试,是我错了,随风兄是正确的。

[ 本帖最后由 batman 于 2009-4-17 23:34 编辑 ]
作者: woxingwoshu007    时间: 2009-4-18 00:44     标题: 回复 1楼 的帖子

精华啊.........我一直在思考这样的问题..及时雨啊..随风顶你了
其次我还学会了:for /f "delims=" %%a in (a.txt) do
for /f "delims=" %%a in ('type a.txt') do 是一样的效果
作者: yangyuankui    时间: 2009-4-21 13:58

请问下用FOR 语句能不能替换文件中的字符,
作者: kingaidai    时间: 2009-4-21 15:46

原帖由 yangyuankui 于 2009-4-21 13:58 发表
请问下用FOR 语句能不能替换文件中的字符,

我也想知道这个问题,求解
作者: 慕夜蓝化    时间: 2015-1-4 11:13

本帖最后由 慕夜蓝化 于 2015-1-4 11:18 编辑
  1. @echo off
  2. for /f "delims=" %%a in (1.txt) do (
  3.     echo abcdefgh >1.txt
  4.     echo %%a >>1.txt&pause >nul
  5. )
  6. pause
复制代码
添加pause按钮,每执行一次,打开一次1.txt,由此可见,for /f 是仅打开一次i/o开关,将所读取内容存储于内存中,以备使用。
还有,如果文本文件为0字节,for 命令的运行,将无从谈起。
同样,for /f 命令支持所有在命令提示符下能够产生字节的命令:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "n=0"
  4. :loop
  5. set/a c+=1
  6. for /f "delims=" %%i in ('set/a n+=1') do (
  7.     echo,%%i
  8.     echo,!n!
  9. )
  10. if %c% equ 3 goto :b
  11. goto :loop
  12. :b
  13. pause&exit
复制代码
期间n的值并未发生变化,可以这样讲,此时for /f %%i in提取到了set/a 运算所得出的结果,并赋予%i,但无论运行多少次,n的值都不会改变。因为命令所产生的结果,被%i所提取。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2