Board logo

标题: [文本处理] [已解决]批处理for循环如何保留空行? [打印本页]

作者: Linux9253    时间: 2015-7-6 10:26     标题: [已解决]批处理for循环如何保留空行?

本人小白、用for遍历文件的时候都是跳过空行的、但现在环境需要保留空行、求大神、需要说明的是文件里有“:”号、
就是跳转的地方因为我找到一个但是加入bat里有:号的话就会把:去掉、那么跳转就不行了、求大神帮忙。
  1. (for /f "tokens=1* delims=:" %%m in ('findstr /n .* %FileName%')
复制代码

作者: DAIC    时间: 2015-7-6 10:40

请把完整代码发出来,并举例说明什么是bat里有:号的话就会把:去掉、那么跳转就不行了
作者: Linux9253    时间: 2015-7-6 10:58

回复 1# Linux9253
  1. set count=""
  2. for /f %%a in ('type %hqlopwd%\count.log') do set count=%%a
  3. if %Number% lss 2 goto check
  4. if %count% == # goto check
  5. set n=
  6. for /f "tokens=8" %%i in (%hqlopwd%\%Serfile%) do (set /a n+=1 &if !n! leq 2 set Systime=%%i)
  7. set localF=%time:~3,2%
  8. set localM=%time:~6,2%
  9. set SystimeF=%Systime:~3,2%
  10. set SystimeM=%Systime:~6,2%
  11. if  "--" == "%SystimeM%" if  "--" == "%SystimeF%" echo # > %hqlopwd%\count.log & start "cmd /c" %0 && exit
  12. set /a grpeq=%localM% - %SystimeM%
  13. set grpje=%grpeq:~0,1%
  14. if %grpje% == - set grpeq=%grpeq:~1%
  15. if %localF% == %SystimeF% if %grpeq% gtr 15 echo # > %hqlopwd%\count.log & start "cmd /c" %0 && exit
  16. set /a grp=%localF% - %SystimeF%
  17. set grpri=%grp:~0,1%
  18. if %grpri% == - set grp=%grp:~1%
  19. if %grp% geq 1 if 45 gtr %SystimeM%  echo # > %hqlopwd%\count.log & start "cmd /c" %0 && exit
  20. :check
  21. if %Number% gtr 60 echo .>%hqlopwd%\count.log
复制代码
这是代码的一部分、是个bat文件、也是要处理的文件、但这里有跳转
  1. :check
  2. if %Number% gtr 60 echo .>%hqlopwd%\count.log
复制代码
这个是我现在用的代码、可以显示空行
  1. copy /y %FileName% %FileName%.bak & set a=
  2. (for /f "tokens=1* delims=:" %%m in ('findstr /n .* %FileName%') do (set line=%%n
  3. if "!line!"=="rem var1" (echo.%%n)
复制代码
但问题是、这段代码会把开头的:号去掉、这样程序就出错了、会变成
  1. check
  2. if %Number% gtr 60 echo .>%hqlopwd%\count.log
复制代码
所以求大神帮忙、。。。
作者: pcl_test    时间: 2015-7-6 12:13

吞掉:的原因是因为delims=:,你的代码以:为分隔符,故略去,然输出命令行到文件,可用more,但是你提供的代码都不完整,不知你欲何为,最好把完整代码文件打包发上来并说清楚实际要求
作者: DAIC    时间: 2015-7-6 13:22

回复 3# Linux9253


    是不是发错代码了?if "!line!"=="rem var1" 这个条件是想表达什么意思?
作者: Linux9253    时间: 2015-7-6 16:21

回复 3# Linux9253


   我写的代码太多了、很乱、为了不党务各位的时间、我就简单的把需求说下、有两个bat  A和B,
A就处理bat B的、现在我想让A处理B的时候保留空行、但B里面有:、也就是跳转、我上面的语句大神
也看到了、处理完后“:”就不见了、影响了B的执行性、确实如你所说、delims=: 我也知道是这边的问题、但就是不知道怎么处理、求大神帮忙、
作者: Linux9253    时间: 2015-7-6 16:24

回复 4# pcl_test


有两个bat  A和B,A就处理bat B的、现在我想让A处理B的时候保留空行、但B里面有:、也就是跳转、我上面的语句大神
也看到了、处理完后“:”就不见了、影响了B的执行性、

代码是没有错了、只是一部分、所以导致您没有看明白、你说的那个地方只是我故意插入的一个标签、用于指定位置、
然后插入指定语句。
作者: DAIC    时间: 2015-7-6 16:49

delims 和 findstr /n 的特性决定了你这种思路是行不通的。
请你举例说明一下a.bat需要如何处理b.bat以及这样处理的目的是什么,大家可以帮你看看有没有变通的方法。
作者: pcl_test    时间: 2015-7-6 17:23

本帖最后由 pcl_test 于 2015-7-6 21:27 编辑

回复 7# Linux9253
测试文件以你3楼的为例
  1. @echo off& setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('findstr /n .* "测试.txt"') do (
  3. set "str=%%a"&set "n="
  4. call :loop
  5. ))>"结果.txt"
  6. pause
  7. ::判断每行首个:的位置
  8. :loop
  9. for %%b in (0 1 2 3) do if "!str:~%%b,1!" equ ":" (
  10. set /a n=%%b+1
  11.     for %%c in (!n!) do if "!str:~%%c!" equ "rem var1" (
  12.         echo;!str:~%%c!
  13.         ::插入的内容
  14.         echo;set %file1%1= ^&set %file1%2= ^&set %file1%3= ^&set %file1%4=
  15.     ) else echo;!str:~%%c!
  16. goto :eof))
复制代码

作者: Linux9253    时间: 2015-7-6 20:53

回复 9# pcl_test


非常感谢、我测试了、你的代码确实可以输出空行、但是会出现重复的行
、还有一点向你请教、在你的代码中、怎么在现有的功能上加上在指定行
下面添加行呢?
下面是我的源代码
  1. rem 要修改的文件名
  2. set FileName=123.txt
  3. rem 文件区域(建议不需要后缀名)
  4. set file1=example
  5. rem set file2=
  6. rem set file2=
  7. (for /f "tokens=1* delims=:" %%m in ('findstr /n .* %FileName%') do (set line=%%n
  8. if "!line!"=="rem var1" (echo.%%n
  9. echo set %file1%1= ^&set %file1%2= ^&set %file1%3= ^&set %file1%4=
  10. rem echo set %file2%1= ^&set %file2%2= ^&set %file2%3= ^&set %file2%4=
  11. rem echo set %file3%1= ^&set %file3%2= ^&set %file3%3= ^&set %file3%4=
  12. )else echo.%%n)))))>make.txt && move make.txt %FileName% >nul
复制代码

作者: Linux9253    时间: 2015-7-6 21:04

回复 8# DAIC


    非常感谢,看到你说的,我简单的想想,确实只需要保留空行就行了、还有、有什么好的输出对其方式分享下呗、
这也是为难我的一个难题
比如123.txt
  1. admin  agr
  2. 123 rdfae
  3. qwertyuio aegrae
  4. 0 aegtrrae
复制代码
echo 出来后是
  1. admin   agr
  2. 123    rdfae
  3. qwertyuio aegrae
  4. 0 aegtrrae
复制代码

作者: CrLf    时间: 2015-7-6 21:05

findstr /n . a.txt 的格式不会处理的话,可以简单改用 find /n /v "" <a.txt
作者: CrLf    时间: 2015-7-6 21:09

本帖最后由 CrLf 于 2015-7-6 23:23 编辑

改用 set /p 也可,举个栗子
@echo off&setlocal enabledelayedexpansion
(for /f %%m in ('findstr /n .* %FileName%') do (set /p line=
if "!line!"=="rem var1" (echo.!line!
rem ....................
)else echo.!line!)))))>make.txt && move make.txt %FileName% >nul
作者: Linux9253    时间: 2015-7-6 21:15

回复 12# CrLf


    大哥,你说的好像是去空行的吧,我的问题是 留下空行
其实我的现在的问题就是,比如下面文件
  1. admin
  2. eney
  3. :adihiusa :
  4. dsfinadng !n!
  5. jdhfu: id
  6. rem var1
  7. sdsfkoif
  8. rem var2
  9. sdfjnjd
  10. rem var3
  11. :adnin
  12. 0 aegtr :rae
复制代码
在保留空行的前提下、在指定行rem var1 ,rem var2 和 rem var3 下面添加一些语句、
并且其他的不变
作者: Linux9253    时间: 2015-7-6 21:24

改用 set /p 也可,举个栗子
@echo off&setlocal enabledelayedexpansion
(for /f %%m in ('findstr /n . ...
CrLf 发表于 2015-7-6 21:09



    你确定这个能用?为什么我怎么改都执行不起呢?
可能是我技术问题吧
作者: pcl_test    时间: 2015-7-6 21:27

回复 10# Linux9253

已修改
作者: Linux9253    时间: 2015-7-6 21:50

本帖最后由 Linux9253 于 2015-7-6 21:53 编辑

回复 9# pcl_test


    非常感谢,真厉害、是不是可以多次添加、假如有rem var2 、rem var3呢、下面是我修改的代码
但好像不行、求教。。。还有就是还有就是变量延迟的问题 ,好像只要是类似与!n!这样的变量都输出的不是原样了、
真的非常感谢、、、、
  1. @echo off& setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('findstr /n .* "123.txt"') do (
  3. set "str=%%a"&set "n="
  4. call :loop
  5. ))>"结果.txt"
  6. pause
  7. ::判断每行首个:的位置
  8. :loop
  9. for %%b in (0 1 2 3) do if "!str:~%%b,1!" equ ":" (
  10. set /a n=%%b+1
  11.     for %%c in (!n!) do if "!str:~%%c!" equ "rem var1" (
  12.         echo;!str:~%%c!
  13.         ::插入的内容
  14.         echo;set %file1%1= ^&set %file1%2= ^&set %file1%3= ^&set %file1%4=
  15.     ) else (if "!str:~%%c!" equ "rem var2"
  16. echo;!str:~%%c!
  17. echo;admin
  18. )else echo;!str:~%%c!
  19. goto :eof))
复制代码

作者: pcl_test    时间: 2015-7-6 22:01

本帖最后由 pcl_test 于 2015-7-6 22:03 编辑

回复 17# Linux9253
没发现什么变量延迟问题,不知你说的什么
  1.     for %%c in (!n!) do if "!str:~%%c!" equ "rem var1" (
  2.         echo;!str:~%%c!
  3.         echo;测试1
  4.     ) else if "!str:~%%c!" equ "rem var2" (
  5.         echo;!str:~%%c!
  6.         echo;测试2
  7.     ) else if "!str:~%%c!" equ "rem var3" (
  8.         echo;!str:~%%c!
  9.         echo;测试3
  10.     ) else echo;!str:~%%c!
复制代码

作者: Linux9253    时间: 2015-7-6 22:46

回复 18# pcl_test


    真的很感谢、你解决我%98的问题了、厉害
你知道的。我修改的对象是一个bat脚本、里面启用的变量延迟(就是!str!)形式的、
就用两个!!号、中间加一个字符串,我用你的代码执行后、可以完美的替换和保留空行、
但是变量延迟的部分就变的莫名其妙了、我给你截图、

图片左边是样本,右边是执行的结果,看第三行,昨边是!n!,右边变成“2”,
我测试过只要是这种类型的都是一样、都找不到规律、求大神帮忙看看,,,
作者: /zhqsystem/zhq    时间: 2015-7-7 00:32

为什么要分割:号呢?难道要处理:号左右的数据?如果想加载所有用
for /f "tokens=* delims=" %%i in (myfile.txt) do ()
循环提取N次在%%i(这里已经加载了所有只是数据不一样)的前提下再次提取也许会达到要求
作者: pcl_test    时间: 2015-7-7 00:33

本帖最后由 pcl_test 于 2015-7-7 00:48 编辑

回复 19# Linux9253
  1. 1>1/* :
  2. @echo off
  3. dir /b "测试.txt"|cscript -nologo -e:jscript "%~f0"
  4. echo 完成!
  5. ping -n 2 0 >nul&exit/b
  6. */
  7. function toFile(file){
  8. var fso = new ActiveXObject("Scripting.FileSystemObject");
  9. var f1 = fso.OpenTextFile(file,1,false);
  10. var f2 = fso.CreateTextFile("$NEW_"+file,1);
  11. var txt="";
  12. while(!f1.AtEndOfStream){
  13. var str=f1.ReadLine();
  14. if (str=="rem var1"){
  15.     txt=str+"\r\n"+"测试内容1";
  16. }else if (str=="rem var2"){
  17.     txt=str+"\r\n"+"测试内容2";
  18. }else if (str=="rem var3"){
  19.     txt=str+"\r\n"+"测试内容3";
  20. }else{txt=str;}
  21. f2.WriteLine(txt);
  22. }
  23. f1.Close();
  24. f2.Close();
  25. }
  26. while(!WScript.StdIn.AtEndOfStream){
  27. var f=WScript.StdIn.ReadLine();
  28. toFile(f);
  29. }
复制代码

作者: Linux9253    时间: 2015-7-7 08:54

为什么要分割:号呢?难道要处理:号左右的数据?如果想加载所有用
for /f "tokens=* delims=" %%i in (myfile ...
/zhqsystem/zhq 发表于 2015-7-7 00:32



    这样不打印空行的
作者: Linux9253    时间: 2015-7-7 09:04

本帖最后由 Linux9253 于 2015-7-7 09:41 编辑

回复 21# pcl_test


    刚才我看见时间是凌晨的、谢谢、当时我还以为你都睡了呢、太有乐于助人的精神了、
还有最后一个问题、如果在指定位置添加的不是一行内容、而是三行呢?还有就是要添加的
字符不能是变量嘛?我刚才试了试、好像变量%a% 被打印成原字符了(%a%)
不好意思、有麻烦你了
作者: pcl_test    时间: 2015-7-7 10:54

回复 23# Linux9253
按B文件原样输出,所以变量没有变成值,需直接用值,或在B文件中对变量赋值
  1. if (str=="rem var1"){
  2.     txt=str+"\r\n"+
  3.         "第一行\r\n"+
  4.         "第二行\r\n"+
  5.         "第三行";
  6. }else if (str=="rem var2"){
  7.     txt=str+"\r\n"+
  8.         "第一行\r\n"+
  9.         "第二行\r\n"+
  10.         "第三行";
  11. }else if (str=="rem var3"){
  12.     txt=str+"\r\n"+
  13.         "第一行\r\n"+
  14.         "第二行\r\n"+
  15.         "第三行";
  16. }else{txt=str;}
复制代码

作者: Linux9253    时间: 2015-7-7 11:32

回复  Linux9253
按B文件原样输出,所以变量没有变成值,需直接用值,或在B文件中对变量赋值
pcl_test 发表于 2015-7-7 10:54



    真的非常感谢、您完美的解决了我的问题、再次谢谢。。。
作者: mms0536    时间: 2015-7-12 00:27

额,换个思路,将B批处理的代码都写到A里面,用echo将B一行行打印出来,要修改B的指定内容就成了修改一个变量的内容了。。。。。。。。。。。。。。
作者: terse    时间: 2015-8-14 13:48

没大看懂 发个保留空行的
  1. @echo off
  2. set filename="1.txt"
  3. for /f "delims=0123456789" %%a in ('findstr /n .* %filename%') do (
  4.     set "s=%%a"
  5.     setlocal enabledelayedexpansion
  6.     echo;!s:~1!
  7.     if /i "!s:~1!" == "rem var1" (
  8.        echo;rem var1
  9.     ) else if /i "!s:~1!" == "rem var2" (
  10.        echo;rem var2
  11.     )
  12.     endlocal
  13. )
  14. pause
复制代码





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