返回列表 发帖
原帖由 随风 于 2009-4-23 06:20 发表
牛!
set out=%str: =!!% 好晦涩的写法 不仅使我想起了 %var:*"=set "var=%
它们是兄弟吧 ^_^
百思不得其解 set out=%str: =!!% 这句是如何替换的?能讲解下吗?
你好像少写了个空格 (set "str=!str! !ram:~%%a ...


多谢指出。没注意的确少了个空格,
set out=%str: =!!% 这句是把数字变为变量。
如1 2 3 4 5 6替换为!!1!!2!!3!!4!!5!! 前边已把定义过1~0 为变量为10个字串了,所以输出就是它们的随机组合

学批处理还不到一月,还有很多东西要向各位老大学习

TOP

回复 18楼 的帖子

多谢,原来就是把空格替换为 !! 号啊,汗,想多了,反而把最基础的搞忘了。。。
这样也可以
for /l %%a in (1,1,10) do (set "str=!str! ^!!ram:~%%a,1!^!")
echo %str%COPY

[ 本帖最后由 随风 于 2009-4-23 08:01 编辑 ]
技术问题请到论坛发帖求助!

TOP

第二题,终于能兼容特殊字符,还真是费了番脑筋
@echo off
set str=ABDEFG
set dst=bathome
for /f "delims=" %%i in ('findstr /n .* 12.txt') do (
    set "var=%%i"
    setlocal enabledelayedexpansion
    set var=!var:*:=!
    if defined var (
        set var=!var!//巭//
        set "result="
        call :loop
        echo !result:~,-5!
    ) else echo.!var!
    endlocal
)
pause&exit/b
:loop
set tail=!var:*%str%=!
if "!tail!"=="!var!" (set result=!result!!tail!&goto :eof)
rem set head=!var:%tail%=!
rem 这里用%tail%会导致无法兼容特殊字符
for /f "delims=" %%a in ("!tail!") do set head=!var:%%a=!
rem 上面用for变量中介,虽然开启了变量延迟但即使变量tail中含有感叹号也不影响。
set left=!head:%str%=!
if "!left!%str%"=="!head!" (set result=!result!!left!%dst%) else set result=!result!!head!
set var=!tail!
goto loopCOPY
1

评分人数

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

我也来试试

第二题代码如下:
@echo off
setlocal enabledelayedexpansion
set/p var1=请输入要查找的内容:
set/p var2=请输入要替换的内容:
:len
if not "!var1:~%num1%,1!"=="" (set/a num1+=1&goto :len)
for /f "delims=" %%a in (a.txt) do (
set str=%%a
set/a num+=1
call :replace !str! !num1!
)
pause
goto :eof
:replace
set ss=%1
set/a n=0
:a
set/a m=%n%+%2
if not "!ss:~%n%,1!"=="" (
if "!ss:~%n%,%2!"=="!var1!" (
set ss=!ss:~0,%n%!!var2!!ss:~%m%!
set/a n+=1
goto :a
) else (set/a n+=1&goto:a)
) else (echo !ss!>>aa.txt)COPY

[ 本帖最后由 sjzong 于 2009-4-24 11:47 编辑 ]
1

评分人数

    • batman: 不通用,效率也不高PB + 10

TOP

第一题

@echo off&setlocal enabledelayedexpansion
cd.>test.txt
set BIG=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
set a=1
set b=1
:for
set /a n=%RANDOM%%%5
set /a n+=1
for /f "tokens=%n%" %%I in ("abdefg kmli socsd pdxy nq") do (set var=%%I)
set /a m=%RANDOM%%%2
if %m% EQU 1 (for %%i in (%BIG%) do (set var=!var:%%i=%%i!))
set /p var=!var! <nul>>test.txt
set /a a+=1
if %a% GTR 10 (echo.>>test.txt&goto end) else goto for
:end
set /a b+=1
if %b% GTR 10 (goto exit) else set a=1&goto for
:exit
exitCOPY

[ 本帖最后由 czq19731102 于 2009-4-23 21:06 编辑 ]
1

评分人数

TOP

回复 21楼 的帖子

ABDEFGABDEFGabdefgabdefgabdefgABDEFGABDEFGABDEFG
把这行放进去试试
技术问题请到论坛发帖求助!

TOP

回 23楼 的帖子

对了,你说的我已经试过了,可以的!这边有个问题:就是我的这批处理中是已经知道a.txt有十行,所以,我这边直接if !num!==10 goto :b 用来判断是否结束!

如果你把你说的那一行放在a.txt的最后一行,就不能显示了,因为已经是十一行,所以就没有结果!

我还是改过来!用for语句来直接判断a.txt的行数了!!

[ 本帖最后由 sjzong 于 2009-4-23 15:56 编辑 ]

TOP

我在题目中选取ABDEFG来做替换字符是只是为了举例,并不一定总是拿ABDEFG替换为
bathome,所以请大家在解答时还是要注意下代码的通用性,另不要考虑特殊字符。。。
***共同提高***

TOP

回复 24楼 的帖子

你确定你21楼的代码可以?
a.txt 就一行内容
ABDEFGABDEFGabdefgabdefgabdefgABDEFGABDEFGABDEFG
把 ABDEFG 替换为 ------
结果如下:
------ABDEFGabdefgabdefgabdefg------ABDEFG------
技术问题请到论坛发帖求助!

TOP

回复 18楼 的帖子

哇!不到一月就这么厉害了啊!
好另类的思维模式啊!不看作者解说,还真没想到他是这么想的,学习了

[ 本帖最后由 czq19731102 于 2009-4-23 23:02 编辑 ]

TOP

第一题:(加满分也不多,呵呵!)
@echo off&setlocal enabledelayedexpansion
set ``=%%
set "str=abdefg ABDEFG kmli KMLI socsd SOCSD pdxy PDXY nq NQ"
1:>a.txt
:lp
set/a n+=1&set com=
for /l %%a in (1,1,10) do (set/a r=!random!%%10&set "com=!com!!``!!r!")
for /f "tokens=1-10" %%0 in ("%str%") do (echo.%com%>>a.txt)
if %n% lss 10 goto :lp
start a.txt
pauseCOPY

[ 本帖最后由 netbenton 于 2009-4-24 01:50 编辑 ]
1

评分人数

TOP

第二题:(能处理特殊字符:><!%:;"都可以)
@echo off
set so=ABDEFG
set de=bathome
(for /f "tokens=*" %%a in (a.txt) do (
        set str=%%a
        setlocal enabledelayedexpansion
        call :sub
        endlocal
))>b.txt
start b.txt
pause
goto :eof
:sub
set "cs=!str:*%so%=!"
if "!cs!"=="!str!" (
        if !str!==$$ set str=
        if defined ok (echo !ok!!str!) else (echo !str!)
        goto :eof
)
set "cr=!str:%so%%cs%=!"
if not defined cs set cs=$$
set "``=!str:%cs%=!"
if not defined cr set cr=$$
if "!``:%cr%=!"=="%so%" set ``=!``:%so%=%de%!
set ok=!ok!!``!
set str=!cs!
goto :subCOPY

[ 本帖最后由 netbenton 于 2009-4-24 03:25 编辑 ]

TOP

netbenton兄的代码真是出神入化呀。在cn-dos 见识过您的功力

TOP

回复 28楼 的帖子

呵呵,多谢支持。
一月前我也还真不明白tokens delims是代表什么意思。刚好手头有一个任务要做。想了很多办法也没弄好。一不小心,百度到了cn-dos 及本坛。刚好坛上有个例子解决我的问题。但是看了各位老大的代码真是云里雾里的。于是我很强烈地想弄明白这些代码到底是怎么回事。学了几个有限的命令之后,越来越感到这些东西不断地在挑战我的脑细胞。
我觉得把自己的思路用p来实现是一件很爽很有成熟感的事情,我还有很多东西要学。
大家一起努力吧

TOP

回复 30楼 的帖子

29楼解的第一题与15楼思路相近,只是最后一个for没看明白,%%0这里必须是0才行,不知道为什么,不理解这个for的运作原理。
1:>a.txt 比 cd.>a.txt 只相差一个字符,却会出现错误提示,不知为何非要这样写?
难道是为了有意晦涩?

30楼 首先解题考虑不周,与21楼犯同样错误,
对 ABDEFGABDEFGabdefgabdefgabdefgABDEFGABDEFGABDEFG 字符串不能准确替换。
其次,效率不够高,也许是为了兼容特殊字符吧(未作详细测试)
总的来说效率还算过得去。
技术问题请到论坛发帖求助!

TOP

返回列表