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

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

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

评分人数

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

没大看懂 发个保留空行的
  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
复制代码

TOP

额,换个思路,将B批处理的代码都写到A里面,用echo将B一行行打印出来,要修改B的指定内容就成了修改一个变量的内容了。。。。。。。。。。。。。。

TOP

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



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

TOP

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

TOP

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

回复 21# pcl_test


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

TOP

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



    这样不打印空行的

TOP

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

评分人数

TOP

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

TOP

回复 18# pcl_test


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

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

TOP

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

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

回复 10# Linux9253

已修改

TOP

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



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

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

返回列表