返回列表 发帖

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

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

评分人数

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

回复 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

回复 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

回复 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

回复 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

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

TOP

回复 18# pcl_test


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

图片左边是样本,右边是执行的结果,看第三行,昨边是!n!,右边变成“2”,
我测试过只要是这种类型的都是一样、都找不到规律、求大神帮忙看看,,,

TOP

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



    这样不打印空行的

TOP

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

回复 21# pcl_test


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

TOP

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



    真的非常感谢、您完美的解决了我的问题、再次谢谢。。。

TOP

返回列表