批处理之家's Archiver

wxcute 发表于 2008-11-7 18:40

[ 新手习题 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]]

sylovanas 发表于 2008-11-7 21:03

@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
        )

wxcute 发表于 2008-11-8 10:09

回二楼

不错。

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

sylovanas 发表于 2008-11-8 11:03

除错用,

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

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

Batcher 发表于 2008-11-8 11:52

回复 2楼 的帖子

SETLOCAL ENABLEDELAYEDEXPANSION
SET "VAR=%%A"

这两行应交换位置,具体原因请参考:处理特殊字符的几种方法
[url]http://bbs.bathome.net/thread-1224-1-3.html[/url]

Batcher 发表于 2008-11-8 11:56

回复 4楼 的帖子

能否结合一个具体例子讲解一下?

sylovanas 发表于 2008-11-8 12:43

[code]@IF NOT DEFINED DEBUG @ECHO OFF

SET "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]]

akiraakito 发表于 2008-11-14 16:51

[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]

stalker 发表于 2008-11-23 19:57

[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]其实是一样的拉(^_^)

stalker 发表于 2008-11-25 21:54

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

heng520 发表于 2008-12-11 05:38

[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]

skuny 发表于 2009-1-14 15:47

@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

ccmvhd 发表于 2009-1-22 18:33

@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]]

hxinhu12315 发表于 2009-1-28 09:09

@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

aresk 发表于 2009-2-11 20:53

[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]
测试已经通过

irresolute 发表于 2009-2-12 09:26

@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

TonyW 发表于 2009-2-22 10:50

[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

myzwd 发表于 2009-2-22 21:04

回复 1楼 的帖子

@echo off
set 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]]

strong12345 发表于 2009-2-25 00:16

小弟也來發一個

[code]
@echo off
for /f "delims=" %%a in ('type a.txt') do (
call set var=%%a
call echo %%var:他娘的=TMD%%
                                          )
pause>nul
[/code]

zjw767676 发表于 2009-2-25 23:09

[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]

evident 发表于 2009-2-26 16:19

2楼的 我试验了,屏显可以完成显示。 但是a.txt文件中的文字没有更改。

请问怎么更改TXT文件中的文字。 用>>输出?

evident 发表于 2009-2-27 09:01

为什么用>不可以,必须用>>,看命令说明应该可以的。其中还有什么秘密么?

望哪位帮助回答下,小弟新学!

sjzong 发表于 2009-5-10 00:04

回复 22楼 的帖子

你可以测试以下两个例子:[code]@echo off
echo 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]]

风行者 发表于 2009-7-13 03:20

[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]

dazheng 发表于 2009-7-29 18:01

感谢楼上所有

学习了,就不贴了,现在知道SET %PATH:str1=str2%的用法了

hs4814 发表于 2009-8-10 12:49

[code]@echo off
setlocal 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]]

wayaoqiang 发表于 2009-8-12 16:43

[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]]

蜗牛 发表于 2009-8-14 00:28

自己写的,应该没错吧  
@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省去,直接替代
谢谢

wxcute 发表于 2009-8-16 13:30

回复 28楼 的帖子

请用 CODE 将代码闭合
[quote]
[url]http://bbs.bathome.net/thread-404-1-1.html[/url]
如何用 code 把代码扩起来?[/quote]

应该是不能,因为变量替换,这个 “变量” 都没有的话怎么替换呢!

simontczx 发表于 2009-8-16 17:44

for /f "tokens=*" %%i in (a.txt) do (
    set a=%%i
    set a=!a:他娘的=!
    echo !a!
set a=!a:他娘的=!这一句是什么意思啊??为什么要用!!

页: [1] 2 3 4

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.