[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-045】批处理按要求输出字符串并替换字符串

&&为了加强大家对大小写字母处理的技术,特出题,题目如下;
题一
   已知有abdefg kmli socsd pdxy nq五个字符串,要求用批处理随机输出大小写字符串到a.txt,,输出为每行10个字符串,共10
行,示例如下:
nqpdxySOCSDabdefgabdefgnqPDXYnqnqnq
pdxypdxyNQNQSOCSDSOCSDABDEFGKMLIkmlipdxy
socsdsocsdsocsdPDXYABDEFGabdefgPDXYnqsocsdPDXY
KMLIPDXYpdxySOCSDNQSOCSDABDEFGkmliNQABDEFG
SOCSDabdefgSOCSDabdefgPDXYnqKMLISOCSDSOCSDNQ
KMLIkmliabdefgNQnqKMLInqABDEFGKMLIpdxy
kmlipdxykmlipdxynqABDEFGNQKMLIpdxypdxy
pdxynqKMLInqsocsdABDEFGsocsdpdxypdxyABDEFG
KMLIpdxynqSOCSDPDXYKMLIKMLIpdxySOCSDnq
socsdnqNQkmliKMLIpdxynqabdefgSOCSDSOCSD
题二
   要求用批处理对文本a.txt中的字符串进行替换并输出到b.txt,注意替换是区分大小写的,如将里面的ABDEFG全替换成bathome,
但abdfeg不被替换,以上面的文本为例,输出后b.txt的内容应如下:
nqpdxySOCSDabdefgabdefgnqPDXYnqnqnq
pdxypdxyNQNQSOCSDSOCSDbathomeKMLIkmlipdxy
socsdsocsdsocsdPDXYbathomeabdefgPDXYnqsocsdPDXY
KMLIPDXYpdxySOCSDNQSOCSDbathomekmliNQbathome
SOCSDabdefgSOCSDabdefgPDXYnqKMLISOCSDSOCSDNQ
KMLIkmliabdefgNQnqKMLInqbathomeKMLIpdxy
kmlipdxykmlipdxynqbathomeNQKMLIpdxypdxy
pdxynqKMLInqsocsdbathomesocsdpdxypdxybathome
KMLIpdxynqSOCSDPDXYKMLIKMLIpdxySOCSDnq
socsdnqNQkmliKMLIpdxynqabdefgSOCSDSOCSD
第一题满分10分,第二题满分20分,视情况加分,加分以思路为重
***共同提高***

但是不明白为什么要把set/p=%var%<nul>>b.txt&这个&前面的空格去了才是对了,我以前总以为什么空开就是对的。。。。

set /p 后面的所有内容都是提示信息,并不是以<nul终止
测试下面代码便知,变量var的值是a.txt的第一行内容,而1234则为set/p 的提示信息,不在var的值中。
你的代码只是用空设备nul取代了a.txt而以,其他的都一样。
:
  1. @echo off
  2. set /p var=<a.txt 1234
  3. echo;
  4. echo 〔%var%〕
  5. pause
复制代码

又或者
  1. @echo off
  2. set /p var=abcd<a.txt 1234
  3. echo;
  4. echo %var%
  5. pause
复制代码

[ 本帖最后由 随风 于 2009-6-17 17:36 编辑 ]
技术问题请到论坛发帖求助!

TOP

重写了个思路,为什么会出空格?

请大家给看看,指点一下
  1. @echo off
  2. del b.txt
  3. setlocal enabledelayedexpansion
  4. set var=bathome
  5. for /f "delims=" %%i in (a.txt) do set "d=%%i" & call :treat
  6. pause>nul & goto :eof
  7. :treat
  8. set m=0
  9. :cc
  10. set "f=!d:~%m%,1!"
  11. set "e=!d:~%m%,6!"
  12. if "%f%"=="" echo.>>b.txt & goto :eof
  13. if "%e%"=="ABDEFG" (set/p=%var%<nul>>b.txt & set /a m+=5) else (set/p=%f%<nul>>b.txt)
  14. set /a m+=1
  15. goto cc
复制代码


已经找到原因了,这样就好了 set/p=%var%<nul>>b.txt& set  /a m+=5
但是不明白为什么要把set/p=%var%<nul>>b.txt&这个&前面的空格去了才是对了,我以前总以为什么空开就是对的。。。。
学海无涯

TOP

给我的感觉好像for在处理文本的时候总是预读一行,到最后一行它仍然预读下一行,结果下一行是空的,它就终止,可是我这个代码到最后那个if仍然满足条件结果就又重新指定了一遍了,是不是这个原因?
学海无涯

TOP

回复 60楼 的帖子

当时测试是没问题的,今天才发现最后重复了最后一行,现在想了半天了,也没想明白原因,我再想想
学海无涯

TOP

回复 59楼 的帖子

省去"delims= "是因为默认就是以空格为分割符,所以为了缩小代码量,在单独以空格为分隔符可以省略!

开启延迟的时候,到底改用!!还是%%,请参看http://www.bathome.net/viewthrea ... 4%C1%BF%D1%D3%B3%D9

55楼的代码结果,你应该再仔细对照查看替换前和替换后的文本内容,是否只是替换了ABDEFG。
(*^_^*)

TOP

回复 58楼 的帖子

感谢指正!为什么要省去"delims= "这个呢?恩,还有个概念我有些模糊,就是开启延迟的时候,如何区分用!!还是%%

55楼的我测试的时候,是指定的b.txt    最后生成的是bb.txt    ,应该改成a.txt  生成 b.txt就对了

我是新手还望能多多指点
学海无涯

TOP

回复 54楼 的帖子

显示结果正确,代码中有些细节须注意,我给你的代码稍作改动,你可以跟你的52楼代码做一比较:
  1. @echo off&setlocal enabledelayedexpansion
  2. :cc
  3. set ee=
  4. set "var=abdefg ABDEFG kmli KMLI socsd SOCSD pdxy PDXY nq NQ"
  5. set num=0
  6. :aa
  7. set /a num+=1
  8. set /a c=%random%%%10
  9. for /f "tokens=1-10" %%0 in ("%var%") do set "ff=%%%c%"
  10. if %num%==11 goto dd
  11. set "ee=!ee!!ff!"
  12. goto aa
  13. :dd
  14. set /a nm+=1
  15. echo %ee%>>a.txt
  16. if %nm%==10 goto mm
  17. goto cc
  18. :mm
  19. start a.txt
  20. pause
复制代码


你55楼的代码结果不对吧

[ 本帖最后由 keen 于 2009-6-15 12:46 编辑 ]
(*^_^*)

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (abdefg kmli socsd pdxy nq ABDEFG KMLI SOCSD PDXY NQ) do (
  3.     set/a n+=1&set _!n!=%%i
  4. )
  5. (for /l %%a in (1,1,10) do (
  6.     for /l %%b in (1,1,10) do (
  7.         set/a num=!random!%%10+1
  8.         for %%c in (_!num!) do set/p=!%%c!<nul
  9.     )
  10.     echo/
  11. ))>a.txt
  12. (for /f "delims=" %%a in (a.txt) do (
  13.     set str=%%a&set var=!str:abdefg= abdefg !&set "cut="
  14.     for %%b in (!var!) do (
  15.         if /i "%%b" neq "abdefg" (
  16.             set/p=%%b<nul
  17.         ) else (
  18.             if defined cut call,set str=%%str:*!cut!=%%
  19.             if "!str:~,6!" equ "ABDEFG" (set/p=bathome<nul) else (set/p=%%b<nul)
  20.         )
  21.         set cut=%%b
  22.     )
  23.     echo/
  24. ))>b.txt
复制代码

TOP

关于echo %com%的问题

http://bbs.bathome.net/viewthrea ... amp;page=1#pid29527
当我还是个新手的时候就测试过这个问题了,尽管现在我还是新手,可惜当时就一个人指点明白了我当时的疑惑

作为直接取值如echo %%1 %%2 %%3必须是双%

但是作为变量赋值后的调用,赋值必须是单%

还有一个问题是echo %com% 的双%,尽管开启了变量延迟setlocal enabledelayedexpansion,但是我测试发现echo !com!这样的方式是错误的,只能echo %com%,至于为什么还有待高手指点
学海无涯

TOP

第二题

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (b.txt) do set "d=%%i" & call :treat
  4. pause>nul
  5. :treat
  6. set m=0
  7. set "y="
  8. :cc
  9. set "e=!d:~%m%,6!"
  10. set "x=!d:~%m%,1!"
  11. set /a m+=1
  12. if "!e!"=="ABDEFG" set /a m-=1 & call set "y=%%d:!d:~%m%,6!=bathome%%" & set /a m+=1
  13. if "!x!"=="" goto dd
  14. goto cc
  15. :dd
  16. if "!y!"=="" (echo !d!>>bb.txt) else echo !y!>>bb.txt
  17. goto :eof
复制代码
学海无涯

TOP

楼上直接指点吧

我新手,写代码难免有问题的,你是感觉我哪些地方用的不对吗?
学海无涯

TOP

回复 52楼 的帖子

楼上是否对自己的代码测试过?
(*^_^*)

TOP

第一题

  1. echo off
  2. :cc
  3. set ee=
  4. setlocal enabledelayedexpansion
  5. set "var=abdefg ABDEFG kmli KMLI socsd SOCSD pdxy PDXY nq NQ"
  6. set num=0
  7. :aa
  8. set /a num+=1
  9. set /a c=%random%%%10+0
  10. for /f "tokens=1-10 delims= " %%0 in ("%var%") do set "ff=%%%c%"
  11. if !num!==11 goto dd
  12. set "ee=!ee!!ff!"
  13. goto aa
  14. :dd
  15. set /a nm+=1
  16. echo !ee!>>a.txt
  17. if !nm!==10 goto mm
  18. goto cc
  19. :mm
  20. pause
复制代码
学海无涯

TOP

第一题:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (abdefg kmli socsd pdxy nq ABDEFG KMLI SOCSD PDXY NQ) do set /a n+=1&set !n!=%%a
  3. for /l %%b in (1 1 10) do (
  4.     for /l %%i in (1 1 10) do (
  5.         set /a num=!random!%%10+1
  6.             for %%j in (!num!) do set /p=!%%j!<nul
  7. )
  8. echo\
  9. )
  10. pause>nul
复制代码
(*^_^*)

TOP

返回列表