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

[文本处理] [已解决]批处理for循环如何保留空行?

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

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

请把完整代码发出来,并举例说明什么是bat里有:号的话就会把:去掉、那么跳转就不行了

TOP

回复 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
复制代码
所以求大神帮忙、。。。

TOP

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

TOP

回复 3# Linux9253


    是不是发错代码了?if "!line!"=="rem var1" 这个条件是想表达什么意思?

TOP

回复 3# Linux9253


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

TOP

回复 4# pcl_test


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

代码是没有错了、只是一部分、所以导致您没有看明白、你说的那个地方只是我故意插入的一个标签、用于指定位置、
然后插入指定语句。

TOP

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

TOP

本帖最后由 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))
复制代码

TOP

回复 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
复制代码

TOP

回复 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
复制代码

TOP

findstr /n . a.txt 的格式不会处理的话,可以简单改用 find /n /v "" <a.txt

TOP

本帖最后由 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

TOP

回复 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 下面添加一些语句、
并且其他的不变

TOP

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



    你确定这个能用?为什么我怎么改都执行不起呢?
可能是我技术问题吧

TOP

返回列表