标题: [文本处理] [已解决]批处理for循环如何保留空行? [打印本页]
作者: Linux9253 时间: 2015-7-6 10:26 标题: [已解决]批处理for循环如何保留空行?
本人小白、用for遍历文件的时候都是跳过空行的、但现在环境需要保留空行、求大神、需要说明的是文件里有“:”号、
就是跳转的地方因为我找到一个但是加入bat里有:号的话就会把:去掉、那么跳转就不行了、求大神帮忙。- (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 - set count=""
- for /f %%a in ('type %hqlopwd%\count.log') do set count=%%a
- if %Number% lss 2 goto check
- if %count% == # goto check
- set n=
- for /f "tokens=8" %%i in (%hqlopwd%\%Serfile%) do (set /a n+=1 &if !n! leq 2 set Systime=%%i)
- set localF=%time:~3,2%
- set localM=%time:~6,2%
- set SystimeF=%Systime:~3,2%
- set SystimeM=%Systime:~6,2%
- if "--" == "%SystimeM%" if "--" == "%SystimeF%" echo # > %hqlopwd%\count.log & start "cmd /c" %0 && exit
-
- set /a grpeq=%localM% - %SystimeM%
- set grpje=%grpeq:~0,1%
- if %grpje% == - set grpeq=%grpeq:~1%
- if %localF% == %SystimeF% if %grpeq% gtr 15 echo # > %hqlopwd%\count.log & start "cmd /c" %0 && exit
-
- set /a grp=%localF% - %SystimeF%
- set grpri=%grp:~0,1%
- if %grpri% == - set grp=%grp:~1%
- if %grp% geq 1 if 45 gtr %SystimeM% echo # > %hqlopwd%\count.log & start "cmd /c" %0 && exit
-
- :check
- if %Number% gtr 60 echo .>%hqlopwd%\count.log
复制代码
这是代码的一部分、是个bat文件、也是要处理的文件、但这里有跳转- :check
- if %Number% gtr 60 echo .>%hqlopwd%\count.log
复制代码
这个是我现在用的代码、可以显示空行- copy /y %FileName% %FileName%.bak & set a=
- (for /f "tokens=1* delims=:" %%m in ('findstr /n .* %FileName%') do (set line=%%n
- if "!line!"=="rem var1" (echo.%%n)
复制代码
但问题是、这段代码会把开头的:号去掉、这样程序就出错了、会变成- check
- 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楼的为例- @echo off& setlocal enabledelayedexpansion
- (for /f "delims=" %%a in ('findstr /n .* "测试.txt"') do (
- set "str=%%a"&set "n="
- call :loop
- ))>"结果.txt"
- pause
- ::判断每行首个:的位置
- :loop
- for %%b in (0 1 2 3) do if "!str:~%%b,1!" equ ":" (
- set /a n=%%b+1
- for %%c in (!n!) do if "!str:~%%c!" equ "rem var1" (
- echo;!str:~%%c!
- ::插入的内容
- echo;set %file1%1= ^&set %file1%2= ^&set %file1%3= ^&set %file1%4=
- ) else echo;!str:~%%c!
- goto :eof))
复制代码
作者: Linux9253 时间: 2015-7-6 20:53
回复 9# pcl_test
非常感谢、我测试了、你的代码确实可以输出空行、但是会出现重复的行
、还有一点向你请教、在你的代码中、怎么在现有的功能上加上在指定行
下面添加行呢?
下面是我的源代码- rem 要修改的文件名
- set FileName=123.txt
- rem 文件区域(建议不需要后缀名)
- set file1=example
- rem set file2=
- rem set file2=
- (for /f "tokens=1* delims=:" %%m in ('findstr /n .* %FileName%') do (set line=%%n
- if "!line!"=="rem var1" (echo.%%n
- echo set %file1%1= ^&set %file1%2= ^&set %file1%3= ^&set %file1%4=
- rem echo set %file2%1= ^&set %file2%2= ^&set %file2%3= ^&set %file2%4=
- rem echo set %file3%1= ^&set %file3%2= ^&set %file3%3= ^&set %file3%4=
- )else echo.%%n)))))>make.txt && move make.txt %FileName% >nul
复制代码
作者: Linux9253 时间: 2015-7-6 21:04
回复 8# DAIC
非常感谢,看到你说的,我简单的想想,确实只需要保留空行就行了、还有、有什么好的输出对其方式分享下呗、
这也是为难我的一个难题
比如123.txt- admin agr
- 123 rdfae
- qwertyuio aegrae
- 0 aegtrrae
复制代码
echo 出来后是- admin agr
- 123 rdfae
- qwertyuio aegrae
- 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
大哥,你说的好像是去空行的吧,我的问题是 留下空行
其实我的现在的问题就是,比如下面文件- admin
- eney
-
- :adihiusa :
- dsfinadng !n!
- jdhfu: id
-
- rem var1
- sdsfkoif
- rem var2
- sdfjnjd
- rem var3
-
- :adnin
-
- 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!这样的变量都输出的不是原样了、
真的非常感谢、、、、- @echo off& setlocal enabledelayedexpansion
- (for /f "delims=" %%a in ('findstr /n .* "123.txt"') do (
- set "str=%%a"&set "n="
- call :loop
- ))>"结果.txt"
- pause
- ::判断每行首个:的位置
- :loop
- for %%b in (0 1 2 3) do if "!str:~%%b,1!" equ ":" (
- set /a n=%%b+1
- for %%c in (!n!) do if "!str:~%%c!" equ "rem var1" (
- echo;!str:~%%c!
- ::插入的内容
- echo;set %file1%1= ^&set %file1%2= ^&set %file1%3= ^&set %file1%4=
- ) else (if "!str:~%%c!" equ "rem var2"
- echo;!str:~%%c!
- echo;admin
- )else echo;!str:~%%c!
- goto :eof))
复制代码
作者: pcl_test 时间: 2015-7-6 22:01
本帖最后由 pcl_test 于 2015-7-6 22:03 编辑
回复 17# Linux9253
没发现什么变量延迟问题,不知你说的什么- for %%c in (!n!) do if "!str:~%%c!" equ "rem var1" (
- echo;!str:~%%c!
- echo;测试1
- ) else if "!str:~%%c!" equ "rem var2" (
- echo;!str:~%%c!
- echo;测试2
- ) else if "!str:~%%c!" equ "rem var3" (
- echo;!str:~%%c!
- echo;测试3
- ) 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/* :
- @echo off
- dir /b "测试.txt"|cscript -nologo -e:jscript "%~f0"
- echo 完成!
- ping -n 2 0 >nul&exit/b
- */
-
- function toFile(file){
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var f1 = fso.OpenTextFile(file,1,false);
- var f2 = fso.CreateTextFile("$NEW_"+file,1);
- var txt="";
- while(!f1.AtEndOfStream){
- var str=f1.ReadLine();
- if (str=="rem var1"){
- txt=str+"\r\n"+"测试内容1";
- }else if (str=="rem var2"){
- txt=str+"\r\n"+"测试内容2";
- }else if (str=="rem var3"){
- txt=str+"\r\n"+"测试内容3";
- }else{txt=str;}
- f2.WriteLine(txt);
- }
- f1.Close();
- f2.Close();
- }
-
- while(!WScript.StdIn.AtEndOfStream){
- var f=WScript.StdIn.ReadLine();
- toFile(f);
- }
复制代码
作者: 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文件中对变量赋值- if (str=="rem var1"){
- txt=str+"\r\n"+
- "第一行\r\n"+
- "第二行\r\n"+
- "第三行";
- }else if (str=="rem var2"){
- txt=str+"\r\n"+
- "第一行\r\n"+
- "第二行\r\n"+
- "第三行";
- }else if (str=="rem var3"){
- txt=str+"\r\n"+
- "第一行\r\n"+
- "第二行\r\n"+
- "第三行";
- }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
没大看懂 发个保留空行的- @echo off
- set filename="1.txt"
- for /f "delims=0123456789" %%a in ('findstr /n .* %filename%') do (
- set "s=%%a"
- setlocal enabledelayedexpansion
- echo;!s:~1!
- if /i "!s:~1!" == "rem var1" (
- echo;rem var1
- ) else if /i "!s:~1!" == "rem var2" (
- echo;rem var2
- )
- endlocal
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |