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

[文本处理] [已解决]批处理如何添加和去除BAT代码里多个指定行前面::字符?

如何将BAT代码里指定的例如下面5行每行前面都添加和去除::符号并输出,保持其他代码和结构不变。
要求带有2个功能的批处理:
1.添加::符号(注意:如果判断下面几行前面都包含::符号的话则提示无需添加,也无需输出;否则需要处理并输出。)
2.取消::符号(注意:如果判断下面几行前面都不包含::符号的话则提示无需去除,也无需输出;否则需要处理并输出。)
处理或提示完毕后提示按任意键退出
  1. echo 专业:%ip1%: (!xs1!%v1%:00 -- !m22%x1%!%v2%:00) >>"%4%.txt"
  2. echo 业绩:%iq3%: (!m22%x1%!%v2%:00 -- !m22%x2%!%v4%:00) >>"%4%.txt"
  3. echo. >>"%4%.txt"
  4. echo     分类 %5zr% 次 >>"%4%.txt"
  5. echo. >>"%4%.txt"
复制代码
1

评分人数

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

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=3" %%i in ('find /v /c "" 1.txt') do set /a a=%%i
  3. for /f "tokens=1,2 delims=:" %%i in ('findstr /n  /b  "::" 1.txt') do set /a b+=1
  4. if "!b!"=="" exit
  5. if "!b!"=="!a!" exit
  6. set /p aa=要添加::请输入y 去除::输入n:
  7. for /f "delims=" %%i in (1.txt) do (
  8. set str=%%i
  9. if "!aa!"=="n" (
  10. if "!str:~0,2!"== "::"  (echo !str:~2!) else echo !str! )
  11. if "!aa!"=="y" (
  12. if not "!str:~0,2!"== "::"  (echo ::!str!) else echo !str!)
  13. )  
  14. pause
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

本帖最后由 yyykkkyyyy 于 2011-11-29 02:03 编辑

用BAT来处理BAT,不说很难,但象二楼那样简单处理肯定是不行的。既然高手们没来,我这算抛砖引玉吧。
如果按提问里就那五行需要处理实用范围也太窄了,需要按具体文本定哪几行,按“例如”的情况
可用下面代码取得行序号 :
  1. for /f "delims=:" %%i in ('findstr/in "echo.*>>.%%4%%\.txt" a.bat')do call set ns=%%ns% %%i
复制代码
我还是写个指定几个行序号通用性强一些,直接在代码里写定了,可以自己改成临时用set/p接收输入的
  1. @echo off
  2. set fs=a.bat
  3. set fd=b.bat
  4. rem 下一行表示 加/减 :: 在第一个数前附 +/- 的行序号(空行计入序号)
  5. set ns=+2 3 4 6
  6. set "f=%ns:~,1%1"
  7. set "ns=%ns:~1%"
  8. for /f "delims=:" %%i in ('findstr/nb "::" "%fs%"')do set/a #%%i=1
  9. for /f "delims=:" %%i in ('findstr/nb ":::" "%fs%"')do set "##%%i=:"
  10. for /f "delims=:" %%i in ('findstr/nb ":" "%fs%"'
  11.   )do if not defined #%%i set "##%%i=:"
  12. for %%i in (%ns%)do (
  13.      if defined #%%i (
  14.         if %f% lss 0 set fg=y&set/a _%%i=f)else (
  15.         if %f% gtr 0 set fg=y&set/a _%%i=f)
  16. )
  17. if not defined fg echo 不需要更改&goto :end
  18. cd.>"%fd%"
  19. for /f "tokens=1* delims=: " %%i in ('findstr/n .* "%fs%"')do (
  20.    if defined _%%i (>tem.yky echo.%%j&call :yky %%i)else (
  21.      (if defined #%%i set/p=::<nul
  22.      if defined ##%%i set/p=:<nul
  23.      echo.%%j)>>"%fd%"))
  24. del tem.yky
  25. echo ok&goto :end
  26. :yky
  27. call set xx=%%_%1%%
  28. if %xx% gtr 0 (
  29. (set/p=::<nul
  30.   call set/p=%%##%1%%<nul&type tem.yky)>>"%fd%"&goto :eof)
  31. for /f "tokens=* delims=: " %%i in (tem.yky)do (
  32.    (call set/p=%%##%1%%<nul
  33.    echo.%%i)>>"%fd%" &goto :eof)
  34. :end
  35. pause
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

回复 3# yyykkkyyyy


    大师的代码不错,但是
for /f "delims=:" %%i in ('findstr/in "echo.*>>.%%4%%\.txt" a.bat')do call set ns=%%ns% %%i
这个为什么运行没有效果呢?
就像论坛里的代码自动显示行号,咋弄呢

TOP

回复 4# wh1234567


    那句单独运行当然看不出什么,只是赋给变量了。这样吧,把3楼代码的第7-8间插入下面三行,则原第4-7的作用被代替了——只适合所提供的“例如”。至于想象论坛的那样显示行号,你下载个另外的编辑器代替普通记事本就行了
  1. set f=1&set/p f=请输入1或直接回车选择添加:: 其他为去掉::
  2. set ns=&if %f% neq 1 set/a f=-1
  3. for /f "delims=:" %%i in ('findstr/in "echo.*>.*%%4%%\.txt" "%fs%"')do call set ns=%%ns%% %%i
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

回复 3# yyykkkyyyy

这个批处理是不是可以通用,添加或去除其他任意字符?,是不是需要修改哪几处?

TOP

我说的通用性好一些只是对比指定那几行内容而言, 指定某几行或许要通用一些,要知道,修改BAT文件文件有别于普通文件,而且::与标签行的首字符也同了一半,一般文本多半不会以:开头,加上或去掉::还需要判断原来是否已存在::和单: , 只能说是特别为此编写的。要加任意字符不会比这个难,但没必要在此基础上修改,何况这代码只是说可以通过也不是写得很好。

TOP

回复 7# yyykkkyyyy


    大师能不能在此顺便写个通用的指定某几行前面或后面添加和去除任意字符的批处理

TOP

返回列表