批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[ 新手习题 2 ] 批处理字符替换

有一文本内容如下:
a.txt
  1. 你他娘的是谁?他娘的我不告诉你。
  2. 你他娘的到底是谁?我他娘的还就不告诉那个他娘的你。
复制代码


论坛可是不允许用不文明用语的,请大家先把“他娘的”换成“TND”输出一遍,最后去掉这个不雅的词再输出一遍。

让大家都文明起来。

就算你看过别人的帖子了,你也可以再写一个。当然复制就没意义了,一定要自己写。
看似简单的题目,如果你自己写了,可能会发现你的代码原来有错,这样你又可以多学一样本领——改错。
上一题:[ 新手练习 1 ] 简易变量截取
http://bbs.bathome.net/thread-2451-1-1.html
下一题:[ 新手练习 3 ] 简易密码登录
http://bbs.bathome.net/thread-2492-1-1.html

[ 本帖最后由 wxcute 于 2008-11-17 11:31 编辑 ]
1

评分人数

@IF NOT DEFINED DEBUG @ECHO OFF

FOR /F "TOKENS=*" %%A IN (A.TXT) DO (
        SETLOCAL ENABLEDELAYEDEXPANSION
        SET "VAR=%%A"
        SET "VAR=!VAR:他娘的=TND!"
        ECHO !VAR!
        ENDLOCAL
        )
FOR /F "TOKENS=*" %%A IN (A.TXT) DO (
        SETLOCAL ENABLEDELAYEDEXPANSION
        SET "VAR=%%A"
        SET "VAR=!VAR:他娘的=!"
        ECHO !VAR!
        ENDLOCAL
        )
1

评分人数

TOP

回二楼

不错。

我想问下,你为什么每个P都加 “@IF NOT DEFINED DEBUG” 这句呢?

TOP

除错用,

我有在写很多行等级不高的批处理
有些时候要除错必须要检查到哪一行出问题
所以当有变数debug时就会显示执行的行
这样除错比较快

[ 本帖最后由 sylovanas 于 2008-11-8 11:05 编辑 ]

TOP

回复 2楼 的帖子

SETLOCAL ENABLEDELAYEDEXPANSION
SET "VAR=%%A"

这两行应交换位置,具体原因请参考:处理特殊字符的几种方法
http://bbs.bathome.net/thread-1224-1-3.html
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我帮忙写的代码不需要付钱,不用找我要支付宝或微信账号。如果一定要给,请到微信群给大家发红吧。

TOP

回复 4楼 的帖子

能否结合一个具体例子讲解一下?
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我帮忙写的代码不需要付钱,不用找我要支付宝或微信账号。如果一定要给,请到微信群给大家发红吧。

TOP

  1. @IF NOT DEFINED DEBUG @ECHO OFF
  2. SET "SYSTEM=%SYSTEMROOT%\SYSTEM32"
  3. IF EXIST .\TEMP\* DEL .\TEMP\* /Q >NUL 2>&1
  4. IF EXIST LOG.TXT DEL LOG.TXT /Q >NUL 2>&1
  5. SWREG QUERY "HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES" | SED "/.*SERVICES\\/I!d;s/.*SERVICES\\//I;s/$/\x22/" > .\TEMP\TEMP00
  6. GREP -Fviwf .\DAT\SERVICE.DAT .\TEMP\TEMP00 > .\TEMP\SERVICE01
  7. SED "s/\x22$//" .\TEMP\SERVICE01 > .\TEMP\SERVICE02
  8. ECHO AppMgmt>>.\TEMP\SERVICE02
  9. GREP -q "." .\TEMP\SERVICE02 && FOR /F "TOKENS=*" %%A IN (.\TEMP\SERVICE02) DO CALL :SER_CHK "%%A"
  10. GOTO END
  11. :SER_CHK
  12. IF "%~1"=="" GOTO:EOF
  13. IF NOT DEFINED SYSTEMB SET "SYSTEMB=%SYSTEM:\=\\%"
  14. IF NOT DEFINED SYSTEMROOTB SET "SYSTEMROOTB=%SYSTEMROOT:\=\\%"
  15. IF NOT DEFINED PROGRAMB SET "PROGRAMB=%PROGRAMFILES:\=\\%"
  16. IF ABC
  17. SWREG QUERY "HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\%~1" | MTEE /+ .\TEMP\DEBUG01 > .\TEMP\SER_CHK01
  18. GREP -Fiq "   imagepath        " .\TEMP\SER_CHK01 || GOTO:EOF
  19. SET "SER0=S9"
  20. SET "SER1=%~1"
  21. SET "SER2=ERR"
  22. FOR /F "TOKENS=*" %%A IN ('SED -r "/^   START\t.*\t/I!d;s///;s/ .*//" .\TEMP\SER_CHK01') DO SET "SER0=S%%A"
  23. FOR /F "TOKENS=*" %%A IN ('SED -r "/^   DISPLAYNAME\t.*\t/I!d;s///" .\TEMP\SER_CHK01') DO SET "SER1=%%A"
  24. SED "/^   imagepath\t.*\t/I!d;s//\t/" .\TEMP\SER_CHK01 > .\TEMP\SER_CHK02
  25. SED "s/\t\\/\t/;s/\t??\\/\t/;s/\tSYSTEMROOT/\t%SYSTEMROOTB%/I;s/\tSYSTEM32/\t%SYSTEMB%/I;s/\t%%SYSTEMROOT%%/\t%SYSTEMROOTB%/I;s/\t%%PROGRAMFILES%%/\t%PROGRAMB%/I" .\TEMP\SER_CHK02 > .\TEMP\SER_CHK03
  26. GREP -iq "%SYSTEMB%\\SVCHOST\.EXE" .\TEMP\SER_CHK03 && CALL :SVC_CHK "%~1"
  27. IF /I "%SER2%"=="ERR" FOR /F "TOKENS=*" %%A IN (.\TEMP\SER_CHK03) DO SET "SER2=%%A  [%%~TZA]"
  28. ECHO %SER0%  %~1;%SER1%;%SER2%>>LOG.TXT
  29. DEL .\TEMP\SER_CHK0? .\TEMP\SVC_CHK0? /F/Q >NUL 2>&1
  30. SET "SER0="
  31. SET "SER1="
  32. SET "SER2="
  33. GOTO:EOF
  34. :SVC_CHK
  35. IF "%~1"=="" GOTO:EOF
  36. SWREG QUERY "HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\%~1\PARAMETERS" /V "SERVICEDLL" > .\TEMP\SVC_CHK01 2>NUL && (
  37.         SED "/^   SERVICEDLL\t.*\t/I!d;s//\t/" .\TEMP\SVC_CHK01 > .\TEMP\SVC_CHK02
  38.         SED "s/\t\\/\t/;s/\t??\\/\t/;s/\tSYSTEMROOT/\t%SYSTEMROOTB%/I;s/\tSYSTEM32/\t%SYSTEMB%/I;s/\t%%SYSTEMROOT%%/\t%SYSTEMROOTB%/I;s/\t%%PROGRAMFILES%%/\t%PROGRAMB%/I" .\TEMP\SVC_CHK02 > .\TEMP\SVC_CHK03
  39.         FOR /F "TOKENS=*" %%A IN (.\TEMP\SVC_CHK03) DO SET "SER2=%%A  [%%~TZA]"
  40.         DEL .\TEMP\SVC_CHK0? /F/Q >NUL 2>&1
  41.         )
  42. GOTO:EOF
  43. :END
复制代码
上面的到了IF ABC就會強制中斷
如果行數到很多行的時候會很不好找
所以加上DEBUG變數時
顯示出如下
  1. C:\UPX\1>SET "SYSTEM=C:\WINDOWS\SYSTEM32"
  2. C:\UPX\1>IF EXIST .\TEMP\* DEL .\TEMP\* /Q  1>NUL 2>&1
  3. C:\UPX\1>IF EXIST LOG.TXT DEL LOG.TXT /Q  1>NUL 2>&1
  4. C:\UPX\1>SWREG QUERY "HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES"   | SED "/.*SERVIC
  5. ES\\/I!d;s/.*SERVICES\\//I;s/$/\x22/"  1>.\TEMP\TEMP00
  6. C:\UPX\1>GREP -Fviwf .\DAT\SERVICE.DAT .\TEMP\TEMP00  1>.\TEMP\SERVICE01
  7. C:\UPX\1>SED "s/\x22$//" .\TEMP\SERVICE01  1>.\TEMP\SERVICE02
  8. C:\UPX\1>ECHO AppMgmt 1>>.\TEMP\SERVICE02
  9. C:\UPX\1>GREP -q "." .\TEMP\SERVICE02   && FOR /F "TOKENS=*" %A IN (.\TEMP\SERVI
  10. CE02) DO CALL :SER_CHK "%A"
  11. C:\UPX\1>CALL :SER_CHK "1394hub"
  12. C:\UPX\1>IF "1394hub" == "" GOTO:EOF
  13. C:\UPX\1>IF NOT DEFINED SYSTEMB SET "SYSTEMB=C:\\WINDOWS\\SYSTEM32"
  14. C:\UPX\1>IF NOT DEFINED SYSTEMROOTB SET "SYSTEMROOTB=C:\\WINDOWS"
  15. C:\UPX\1>IF NOT DEFINED PROGRAMB SET "PROGRAMB=C:\\Program Files"
  16. 命令語法不正確。
  17. C:\UPX\1>IF ABC
复制代码
這樣找錯誤的行就比較快

[ 本帖最后由 sylovanas 于 2008-11-8 12:46 编辑 ]
3

评分人数

    • wxcute: 好,早看出你不是新手。多谢支持我的帖技术 + 1 PB + 10
    • Batcher: 感谢分享PB + 5
    • batman: 学习了,此法可推广PB + 5

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%a in (a.txt) do (
  4.     set var=%%a
  5.     set change=!var:他娘的=TND!
  6.     echo !change!
  7. )
  8. pause>nul
复制代码
1

评分人数

    • wxcute: 加分鼓励。 不过你的只有一半,要求可是有 ...PB + 3

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%i in (a.txt) do (
  4.     set a=%%i
  5.     set a=!a:他娘的=NND!
  6.     echo !a!
  7. )
  8. for /f "tokens=*" %%i in (xxx.txt) do (
  9.     set a=%%i
  10.     set a=!a:他娘的=!
  11.     echo !a!
  12. )
  13. pause>nul
  14. exit
复制代码
其实是一样的拉(^_^)
2

评分人数

    • impk: 学习一下技术 + 1
    • wxcute: 一样没关系,只要是自己写的就成。不过xxx. ...PB + 2

TOP

忘了改了,开始我自己用来测试的文件是xxx.txt

TOP

  1. @echo off
  2. echo 你他娘的是谁?他娘的我不告诉你。>a.txt
  3. echo 你他娘的到底是谁?我他娘的还就不告诉那个他娘的你。>>a.txt
  4. for /f %%i in (a.txt) do (
  5. set v=%%i
  6. call echo %%v:他娘的=TMD%%
  7. )
  8. pause>nul&cls
  9. for /f %%i in (a.txt) do (
  10. set v=%%i
  11. call echo %%v:他娘的=%%
  12. )
  13. pause>nul
复制代码
1

评分人数

TOP

@ECHO OFF
goto end2
:end2
set str1=你他娘的是谁?他娘的我不告诉你。
set str2=你他娘的到底是谁?我他娘的还就不告诉那个他娘的你。
set a=%str1:他娘的=tnd%
echo %a%
set a=%a:tnd=%
echo %a%
set b=%str2:他娘的=tnd%
echo %b%
set b=%b:tnd=%
echo %b%
pause>nul
1

评分人数

TOP

@echo off&setlocal enabledelayedexpansion
for /f %%i in (1.txt) do (
set ver=%%i
echo !ver:他娘的=TND!
)
pause>nul&exit
学习了,以后可以玩@if not defined debug了,谢谢。。。。

[ 本帖最后由 ccmvhd 于 2009-1-22 18:38 编辑 ]
1

评分人数

TOP

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (a.txt) do (
        set str=%%i
        set "str=!str:他娘的=TND!"
        echo !str!
)
echo.
for /f "tokens=*" %%i in (a.txt) do (
        set str=%%i
        set "str=!str:他娘的=!"
        echo !str!
)
pause>nul
1

评分人数

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in (a.txt) do (
  4. set a=%%i
  5. set var=!a:他娘的=TND!
  6. echo !var!>>abc.txt
  7. )
  8. del a.txt /q
  9. move abc.txt a.txt
  10. ::上面是把他娘的改成TND。
  11. ::下面把TND彻底去掉
  12. for /f %%i in (a.txt) do (
  13. set a=%%i
  14. set var=!a:TND=!
  15. echo !var!>>abc.txt
  16. )
  17. del a.txt /q
  18. move abc.txt a.txt
  19. pause
  20. exit
复制代码

测试已经通过
1

评分人数

TOP

返回列表