找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 270097|回复: 102

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

[复制链接]
发表于 2008-11-7 18:40:26 | 显示全部楼层 |阅读模式
有一文本内容如下:
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 编辑 ]

评分

参与人数 1PB +2 收起 理由
Batcher + 2 Good work!

查看全部评分

发表于 2008-11-7 21:03:50 | 显示全部楼层
@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
        )

评分

参与人数 1PB +5 收起 理由
wxcute + 5 不错。

查看全部评分

 楼主| 发表于 2008-11-8 10:09:33 | 显示全部楼层

回二楼

不错。

我想问下,你为什么每个P都加 “@IF NOT DEFINED DEBUG” 这句呢?
发表于 2008-11-8 11:03:45 | 显示全部楼层
除错用,

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

[ 本帖最后由 sylovanas 于 2008-11-8 11:05 编辑 ]
发表于 2008-11-8 11:52:37 | 显示全部楼层

回复 2楼 的帖子

SETLOCAL ENABLEDELAYEDEXPANSION
SET "VAR=%%A"

这两行应交换位置,具体原因请参考:处理特殊字符的几种方法
http://bbs.bathome.net/thread-1224-1-3.html
发表于 2008-11-8 11:56:50 | 显示全部楼层

回复 4楼 的帖子

能否结合一个具体例子讲解一下?
发表于 2008-11-8 12:43:18 | 显示全部楼层
  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 编辑 ]

评分

参与人数 3PB +20 技术 +1 收起 理由
wxcute + 10 + 1 好,早看出你不是新手。多谢支持我的帖
Batcher + 5 感谢分享
batman + 5 学习了,此法可推广

查看全部评分

发表于 2008-11-14 16:51:39 | 显示全部楼层
  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
复制代码

评分

参与人数 1PB +3 收起 理由
wxcute + 3 加分鼓励。 不过你的只有一半,要求可是有 ...

查看全部评分

发表于 2008-11-23 19:57:59 | 显示全部楼层
  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
复制代码
其实是一样的拉(^_^)

评分

参与人数 2PB +2 技术 +1 收起 理由
impk + 1 学习一下
wxcute + 2 一样没关系,只要是自己写的就成。不过xxx. ...

查看全部评分

发表于 2008-11-25 21:54:54 | 显示全部楼层
忘了改了,开始我自己用来测试的文件是xxx.txt
发表于 2008-12-11 05:38:57 | 显示全部楼层

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

评分

参与人数 1PB +2 收起 理由
wxcute + 2 不错,鼓励下

查看全部评分

发表于 2009-1-14 15:47:43 | 显示全部楼层
@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

评分

参与人数 1PB +2 收起 理由
wxcute + 2 鼓励

查看全部评分

发表于 2009-1-22 18:33:47 | 显示全部楼层
@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 编辑 ]

评分

参与人数 1PB +1 收起 理由
wxcute + 1 鼓励下

查看全部评分

发表于 2009-1-28 09:09:29 | 显示全部楼层
@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

评分

参与人数 1PB +1 收起 理由
wxcute + 1 鼓励下下

查看全部评分

发表于 2009-2-11 20:53:26 | 显示全部楼层
  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
复制代码

测试已经通过

评分

参与人数 1PB +2 收起 理由
wxcute + 2 忘记加分了

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:50 , Processed in 0.022163 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表