返回列表 发帖
第一题:(加满分也不多,呵呵!)
@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

1:>a.txt指在产生一个空文件,出错提示,不会有任何影响,
这个说明了1:是可以作为盘符的,如果存在。刚看了别人的多种产生临时文件的方法,所以就试一下,没别的什么意思。
ABDEFGABDEFGabdefgabdefgabdefgABDEFGABDEFGABDEFG
和“”
不能正确的问题确实没有考虑到。回头再想想,

TOP

两个问题都解决了

用加尾巴,最后再丢弃,解决不能正确替换问题
用单个引号转为两个引号(用变量代入法才做到),最后再换回来。解决双引号错误问题
@echo off
set so=ABDEFG
set de=bathome
set @="
set @@=""
(for /f "tokens=*" %%a in (a.txt) do (
set str=%%a#批处理#&setlocal enabledelayedexpansion
set "str=!str:%@%=%@@%!"
call :sub
endlocal
))>b.txt
start b.txt
pause
goto :eof
:sub
set "cs=!str:*%so%=!"
if "!cs!"=="!str!" (
set ok=!ok!!str!
set "ok=!ok:%@@%=%@%!"
echo !ok:~,-5!
goto :eof
)
set "cr=!str:%so%%cs%=!"
set "``=!str:%cs%=!"
if defined cr set "``=!``:%cr%=!"
if "!``!"=="%so%" set ``=%de%
set ok=!ok!!cr!!``!
set str=!cs!
goto :subCOPY
这种方法,偶认为肯定比用findstr要高效。

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

TOP

re 随风

偶认为echo.%com%>>a.txt是预处理。
同一组数据里面只对%号进行一次替换和减半操作,(加call 后面算是组外的了)
而for 令牌,本来就是只用一个%号的,只要经预处理后形成合适的参数形式,for运行时就会进行取值替换。
如:set  `=%%
for /f "tokens=1,2,3" %%a in ("aa bb cc") do (echo %`%a %`%b %`%c)
一样能正确执行。

其实com的值是%0%1%3。。。而不是:%%0%%1%%3
可用set com查看就知道了。

谢谢测试,确实不能处理所有的特殊字符,君的方法好像处理格时也会出问题。

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

TOP

第一题,换种方法
@echo off&setlocal enabledelayedexpansion
set "sou=abdefg ABDEFG kmli KMLI socsd SOCSD pdxy PDXY nq NQ"
(for %%a in (%sou%) do (
set des=
for %%b in (%sou%) do (
  set str= %sou%
  set/a a=!random!%%11
  for /l %%c in (0,1,!a!) do (set str=!str:* =!)
  for /f %%d in ("!str!") do set des=!des!%%d
)
echo !des!
))>a.txt
start a.txt
pauseCOPY

TOP

返回列表