[ 新手习题 2 ] 批处理字符替换
有一文本内容如下:a.txt[size=2][code]你他娘的是谁?他娘的我不告诉你。
你他娘的到底是谁?我他娘的还就不告诉那个他娘的你。[/code][/size]
论坛可是不允许用不文明用语的,请大家先把“他[size=2]娘的[/size]”换成“TND”输出一遍,最后去掉这个不雅的词再输出一遍。
[color=Blue]让大家都文明起来。[/color]
[quote]
就算你看过别人的帖子了,你也可以再写一个。当然复制就没意义了,一定要自己写。
看似简单的题目,如果你自己写了,可能会发现你的代码原来有错,这样你又可以多学一样本领——改错。
[/quote][quote]
上一题:[ 新手练习 1 ] 简易变量截取
[url=http://bbs.bathome.net/thread-2451-1-1.html]http://bbs.bathome.net/thread-2451-1-1.html[/url]
下一题:[ 新手练习 3 ] 简易密码登录
[url=http://bbs.bathome.net/thread-2492-1-1.html]http://bbs.bathome.net/thread-2492-1-1.html[/url]
[/quote]
[[i] 本帖最后由 wxcute 于 2008-11-17 11:31 编辑 [/i]] @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
)
回二楼
不错。我想问下,你为什么每个P都加 “@IF NOT DEFINED DEBUG” 这句呢? 除错用,
我有在写很多行等级不高的批处理
有些时候要除错必须要检查到哪一行出问题
所以当有变数debug时就会显示执行的行
这样除错比较快
[[i] 本帖最后由 sylovanas 于 2008-11-8 11:05 编辑 [/i]]
回复 2楼 的帖子
SETLOCAL ENABLEDELAYEDEXPANSIONSET "VAR=%%A"
这两行应交换位置,具体原因请参考:处理特殊字符的几种方法
[url]http://bbs.bathome.net/thread-1224-1-3.html[/url]
回复 4楼 的帖子
能否结合一个具体例子讲解一下? [code]@IF NOT DEFINED DEBUG @ECHO OFFSET "SYSTEM=%SYSTEMROOT%\SYSTEM32"
IF EXIST .\TEMP\* DEL .\TEMP\* /Q >NUL 2>&1
IF EXIST LOG.TXT DEL LOG.TXT /Q >NUL 2>&1
SWREG QUERY "HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES" | SED "/.*SERVICES\\/I!d;s/.*SERVICES\\//I;s/$/\x22/" > .\TEMP\TEMP00
GREP -Fviwf .\DAT\SERVICE.DAT .\TEMP\TEMP00 > .\TEMP\SERVICE01
SED "s/\x22$//" .\TEMP\SERVICE01 > .\TEMP\SERVICE02
ECHO AppMgmt>>.\TEMP\SERVICE02
GREP -q "." .\TEMP\SERVICE02 && FOR /F "TOKENS=*" %%A IN (.\TEMP\SERVICE02) DO CALL :SER_CHK "%%A"
GOTO END
:SER_CHK
IF "%~1"=="" GOTO:EOF
IF NOT DEFINED SYSTEMB SET "SYSTEMB=%SYSTEM:\=\\%"
IF NOT DEFINED SYSTEMROOTB SET "SYSTEMROOTB=%SYSTEMROOT:\=\\%"
IF NOT DEFINED PROGRAMB SET "PROGRAMB=%PROGRAMFILES:\=\\%"
IF ABC
SWREG QUERY "HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\%~1" | MTEE /+ .\TEMP\DEBUG01 > .\TEMP\SER_CHK01
GREP -Fiq " imagepath " .\TEMP\SER_CHK01 || GOTO:EOF
SET "SER0=S9"
SET "SER1=%~1"
SET "SER2=ERR"
FOR /F "TOKENS=*" %%A IN ('SED -r "/^ START\t.*\t/I!d;s///;s/ .*//" .\TEMP\SER_CHK01') DO SET "SER0=S%%A"
FOR /F "TOKENS=*" %%A IN ('SED -r "/^ DISPLAYNAME\t.*\t/I!d;s///" .\TEMP\SER_CHK01') DO SET "SER1=%%A"
SED "/^ imagepath\t.*\t/I!d;s//\t/" .\TEMP\SER_CHK01 > .\TEMP\SER_CHK02
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
GREP -iq "%SYSTEMB%\\SVCHOST\.EXE" .\TEMP\SER_CHK03 && CALL :SVC_CHK "%~1"
IF /I "%SER2%"=="ERR" FOR /F "TOKENS=*" %%A IN (.\TEMP\SER_CHK03) DO SET "SER2=%%A [%%~TZA]"
ECHO %SER0% %~1;%SER1%;%SER2%>>LOG.TXT
DEL .\TEMP\SER_CHK0? .\TEMP\SVC_CHK0? /F/Q >NUL 2>&1
SET "SER0="
SET "SER1="
SET "SER2="
GOTO:EOF
:SVC_CHK
IF "%~1"=="" GOTO:EOF
SWREG QUERY "HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\%~1\PARAMETERS" /V "SERVICEDLL" > .\TEMP\SVC_CHK01 2>NUL && (
SED "/^ SERVICEDLL\t.*\t/I!d;s//\t/" .\TEMP\SVC_CHK01 > .\TEMP\SVC_CHK02
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
FOR /F "TOKENS=*" %%A IN (.\TEMP\SVC_CHK03) DO SET "SER2=%%A [%%~TZA]"
DEL .\TEMP\SVC_CHK0? /F/Q >NUL 2>&1
)
GOTO:EOF
:END[/code]上面的到了IF ABC就會強制中斷
如果行數到很多行的時候會很不好找
所以加上DEBUG變數時
顯示出如下[code]C:\UPX\1>SET "SYSTEM=C:\WINDOWS\SYSTEM32"
C:\UPX\1>IF EXIST .\TEMP\* DEL .\TEMP\* /Q 1>NUL 2>&1
C:\UPX\1>IF EXIST LOG.TXT DEL LOG.TXT /Q 1>NUL 2>&1
C:\UPX\1>SWREG QUERY "HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES" | SED "/.*SERVIC
ES\\/I!d;s/.*SERVICES\\//I;s/$/\x22/" 1>.\TEMP\TEMP00
C:\UPX\1>GREP -Fviwf .\DAT\SERVICE.DAT .\TEMP\TEMP00 1>.\TEMP\SERVICE01
C:\UPX\1>SED "s/\x22$//" .\TEMP\SERVICE01 1>.\TEMP\SERVICE02
C:\UPX\1>ECHO AppMgmt 1>>.\TEMP\SERVICE02
C:\UPX\1>GREP -q "." .\TEMP\SERVICE02 && FOR /F "TOKENS=*" %A IN (.\TEMP\SERVI
CE02) DO CALL :SER_CHK "%A"
C:\UPX\1>CALL :SER_CHK "1394hub"
C:\UPX\1>IF "1394hub" == "" GOTO:EOF
C:\UPX\1>IF NOT DEFINED SYSTEMB SET "SYSTEMB=C:\\WINDOWS\\SYSTEM32"
C:\UPX\1>IF NOT DEFINED SYSTEMROOTB SET "SYSTEMROOTB=C:\\WINDOWS"
C:\UPX\1>IF NOT DEFINED PROGRAMB SET "PROGRAMB=C:\\Program Files"
命令語法不正確。
C:\UPX\1>IF ABC[/code]這樣找錯誤的行就比較快
[[i] 本帖最后由 sylovanas 于 2008-11-8 12:46 编辑 [/i]] [code]@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (a.txt) do (
set var=%%a
set change=!var:他娘的=TND!
echo !change!
)
pause>nul [/code] [code]@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (a.txt) do (
set a=%%i
set a=!a:他娘的=NND!
echo !a!
)
for /f "tokens=*" %%i in (xxx.txt) do (
set a=%%i
set a=!a:他娘的=!
echo !a!
)
pause>nul
exit[/code]其实是一样的拉(^_^) 忘了改了,开始我自己用来测试的文件是xxx.txt [code]
@echo off
echo 你他娘的是谁?他娘的我不告诉你。>a.txt
echo 你他娘的到底是谁?我他娘的还就不告诉那个他娘的你。>>a.txt
for /f %%i in (a.txt) do (
set v=%%i
call echo %%v:他娘的=TMD%%
)
pause>nul&cls
for /f %%i in (a.txt) do (
set v=%%i
call echo %%v:他娘的=%%
)
pause>nul
[/code] @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 @echo off&setlocal enabledelayedexpansion
for /f %%i in (1.txt) do (
set ver=%%i
echo !ver:他娘的=TND!
)
pause>nul&exit
学习了,以后可以玩@if not defined debug了,谢谢。。。。
[[i] 本帖最后由 ccmvhd 于 2009-1-22 18:38 编辑 [/i]] @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 [code]@echo off
setlocal enabledelayedexpansion
for /f %%i in (a.txt) do (
set a=%%i
set var=!a:他娘的=TND!
echo !var!>>abc.txt
)
del a.txt /q
move abc.txt a.txt
::上面是把他娘的改成TND。
::下面把TND彻底去掉
for /f %%i in (a.txt) do (
set a=%%i
set var=!a:TND=!
echo !var!>>abc.txt
)
del a.txt /q
move abc.txt a.txt
pause
exit[/code]
测试已经通过 @echo off
setlocal enabledelayedexpansion
echo 你他娘的是谁?他娘的我不告诉你。>1.txt
echo 你他娘的到底是谁?我他娘的还就不告诉那个他娘的你。>>1.txt
for /f "delims=" %%i in (1.txt) do (
set aa=%%i
set aa=!aa:他娘的=tnd!
echo !aa!
set bb=!aa:tnd=!
echo !bb!
)
pause>nul [code]
@echo off & setlocal enabledelayedexpansion
for /f %%i in (test.txt) do (
set n=%%i
set n=!n:他娘的=TND!
echo !n!
)
pause[/code]
第二题只需要将"TND"该为""就可以去掉"他娘的"那三个字!
想了很久才想起来以前跟着做过类似的例子:
http://bbs.bathome.net/thread-2898-1-1.html
回复 1楼 的帖子
@echo offset tt=TND
for /f "tokens=1-4 delims=他娘的" %%1 in ('more +3 %~s0') do echo %%1%tt%%%2%tt%%%3%tt%%%4
goto:eof
你他娘的是谁?他娘的我不告诉你。
你他娘的到底是谁?我他娘的还就不告诉那个他娘的你。
-------------------------------------
@echo off
for /f "tokens=1-4 delims=他娘的" %%1 in ('more +3 %~s0') do echo %%1 %%2 %%3 %%4
goto:eof
你他娘的是谁?他娘的我不告诉你。
你他娘的到底是谁?我他娘的还就不告诉那个他娘的你。
[[i] 本帖最后由 myzwd 于 2009-2-22 21:06 编辑 [/i]]
小弟也來發一個
[code]@echo off
for /f "delims=" %%a in ('type a.txt') do (
call set var=%%a
call echo %%var:他娘的=TMD%%
)
pause>nul
[/code] [code]@echo off&setlocal EnableDelayedExpansion
for /f %%i in (a.txt) do (
set a=%%i
set a=!a:他娘的=TND!
echo !a!
)
pause[/code][code]@echo off&setlocal EnableDelayedExpansion
for /f %%i in (a.txt) do (
set a=%%i
set a=!a:他娘的=!
echo !a!
)
pause[/code] 2楼的 我试验了,屏显可以完成显示。 但是a.txt文件中的文字没有更改。
请问怎么更改TXT文件中的文字。 用>>输出? 为什么用>不可以,必须用>>,看命令说明应该可以的。其中还有什么秘密么?
望哪位帮助回答下,小弟新学!
回复 22楼 的帖子
你可以测试以下两个例子:[code]@echo offecho 1 >1.txt
echo 2 >1.txt
start 1.txt
pause>nul&exit[/code]例2:[code]@echo off
echo 1 >>2.txt
echo 2 >>2.txt
start 2.txt
pause>nul&exit[/code]观察1.txt 和 2.txt 的内容。
>:表示后面输入的内容会覆盖前面输入的内容。
>>:表示后面输入的内容不会覆盖前面输入的内容,会接在后面!
[[i] 本帖最后由 sjzong 于 2009-5-10 00:06 编辑 [/i]] [code]@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
set /a n+=1
set "s!n!=%%i"
set "d=%%i"
echo !d:他娘的=TND!
)
pause
for /l %%i in (1 1 %n%) do call echo %%s%%i:他娘的=%%
pause[/code]
感谢楼上所有
学习了,就不贴了,现在知道SET %PATH:str1=str2%的用法了 [code]@echo offsetlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (set b=%%i&echo !b:他娘的=TND! )
echo,
for /f "delims=" %%i in (a.txt) do (set b=%%i&echo !b:他娘的=! )
PAUSE>nul[/code]
[[i] 本帖最后由 wxcute 于 2009-8-16 13:25 编辑 [/i]] [code]
@echo off
for /f "delims=" %%a in (a.txt) do set var2=%%a&call echo %%var2:他娘的=TND%%
for /f "delims=" %%a in (a.txt) do set var2=%%a&call echo %%var2:他娘的=%%
pause>nul
[/code]
[[i] 本帖最后由 wayaoqiang 于 2009-8-17 21:07 编辑 [/i]] 自己写的,应该没错吧
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (f:\a.txt) do (
set c=%%i
set str=!c:他娘的=TND!
echo !str!)
pause
我想问问 set c=%%i set str=!c:他娘的=TND! 这两句可以写成一句吗?不是用&之类的,意思是能不能把中间变量c省去,直接替代
谢谢
回复 28楼 的帖子
请用 CODE 将代码闭合[quote]
[url]http://bbs.bathome.net/thread-404-1-1.html[/url]
如何用 code 把代码扩起来?[/quote]
应该是不能,因为变量替换,这个 “变量” 都没有的话怎么替换呢! for /f "tokens=*" %%i in (a.txt) do (
set a=%%i
set a=!a:他娘的=!
echo !a!
set a=!a:他娘的=!这一句是什么意思啊??为什么要用!!