Board logo

标题: [文本处理] 这是不是变量延迟的BUG [打印本页]

作者: canyuexiaolang    时间: 2009-8-28 16:00     标题: 这是不是变量延迟的BUG

  1. 【练习-044】批处理对文本内容加密
复制代码
做题时,运用了变量延迟,输入a本应出来m而它却出来j认真的找了原因,吓我一跳,代码如下
  1. @echo off&setlocal EnableDelayedExpansion
  2. set /p a=
  3. for /f %%i in ("%a%") do (   
  4. set n=%%i
  5. set n=!n:a=m!
  6. set n=!n:b=b!
  7. set n=!n:c=e!
  8. set n=!n:d=w!
  9. set n=!n:e=q!
  10. set n=!n:f=c!
  11. set n=!n:g=i!
  12. set n=!n:h=r!
  13. set n=!n:i=o!
  14. set n=!n:j=\!
  15. set n=!n:k=z!
  16. set n=!n:l=l!
  17. set n=!n:m=u!
  18. set n=!n:n=l!
  19. set n=!n:o=f!
  20. set n=!n:p=a!
  21. set n=!n:q=k!
  22. set n=!n:r=t!
  23. set n=!n:s=x!
  24. set n=!n:t=s!
  25. set n=!n:u=j!
  26. set n=!n:v=v!
  27. set n=!n:w=p!
  28. set n=!n:x=\!
  29. set n=!n:y=g!
  30. set n=!n:z=\!
  31. )
  32. echo %n%
  33. pause
复制代码
它竟把a→m,而m→u,接着u→j在输出("\"是我没找到匹配的英文)


究竟怎么样才能使a变为m在直接输出呢

[ 本帖最后由 canyuexiaolang 于 2009-8-28 16:03 编辑 ]
作者: canyuexiaolang    时间: 2009-8-28 16:26

  1. @echo off&setlocal EnableDelayedExpansion
  2. for /f %%i in (b.txt) do (   
  3. set n=%%i
  4. set n=!n:!!=%!
  5. )
  6. echo %n%>c.txt
  7. pause
复制代码
运行之后竟然在c.txt中写入
  1. ECHO 处于关闭状态。
复制代码
难道变量延迟,还能延迟吗
有点晕
作者: canyuexiaolang    时间: 2009-8-28 16:29

还有
b.txt
是一堆我乱打的东西
目的是把里面的 "!" 替换成 "%"
但是如果写一个"!"
  1. set n=!n:!!=%!
复制代码
改为
  1. set n=!n:!=%!
复制代码
在c.txt会出现 "="

PS:没引号
作者: canyuexiaolang    时间: 2009-8-28 19:16

有没有人知道啊,BATHOME好象没原来热闹了,冷清了许多
作者: tireless    时间: 2009-8-28 19:36

匹配变量时是从左至右的,所以:
set n=!n:!!=%!

变量 n 的值=变量 n: 的值变量 = 的值 (好像没办法用等号作为变量名)

同样的:

set n=!n:!=%!

作者: canyuexiaolang    时间: 2009-8-28 19:46

那怎么替换呢...
作者: tireless    时间: 2009-8-28 20:13     标题: 回复 6楼 的帖子

不太明白你 1 楼的意思。如果把 set n=!n:a=m! 放到最后替换,变量的值里的 a 会被替换为 m
作者: canyuexiaolang    时间: 2009-8-28 20:28


但把它放到最后,那其他的也会变成m的
就是如果
b=a
a=m
最后b也会等于m
作者: tireless    时间: 2009-8-28 23:36

  1. @echo off
  2. set "r=a.m b.b c.e d.w e.q f.c g.i h.r i.o j.、 k.z l.l m.u n.l o.f p.a q.k r.t s.x t.s u.j v.v w.p x.、 y.g z.、"
  3. setlocal EnableDelayedExpansion
  4. set /p a=input:
  5. set n=!a!
  6. for %%a in (!r!) do set n=!n:%%~na=%%~na!
  7. for %%a in (!r!) do set n=!n:%%~na=%%~xa!
  8. set n=!n:.=!
  9. set n=!n:、=\!
  10. echo;!n!
  11. pause
复制代码

[ 本帖最后由 tireless 于 2009-8-28 23:39 编辑 ]
作者: canyuexiaolang    时间: 2009-8-29 07:09

可以啊,哇,你是怎么做到的呢




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2