Board logo

标题: [原创] 批处理中转义符号和引号之间的恶魔法则 [打印本页]

作者: woxingwoshu007    时间: 2009-4-22 20:50     标题: 批处理中转义符号和引号之间的恶魔法则

今天算了忙上了18个小时了......在研究批进度条时发现引号和转义之间的暧昧关系..终于在历时4个小时的整理中把这个教程弄完......这里要谢谢batman提供的帮助:
第一次发,不知道怎么格式才好.就发我自己学习时最常用的代码加语句测试方式.
教程如下:
  1. @echo off
  2. title 引号与转义符号的恶魔规则()
  3. color 5a
  4. echo.
  5. echo.
  6. echo by.............【极度沉沦】................(辅导batman)
  7. echo.
  8. echo.
  9. echo 在搜索百度.goole及相关批论坛均无发现....
  10. echo.
  11. echo.今晚在咨询师傅时:师傅说真是活到老学到老.他们以前都没有注意这方面
  12. echo.
  13. echo 在""中的特殊字符不需要加转义符号否则失去意义
  14. echo.
  15. echo 加了的效果
  16. set "a=echo 12345&echo ^>nul"
  17. %a%
  18. pause
  19. echo 没有加的效果
  20. set "a=echo 12345&echo >nul"
  21. %a%
  22. pause
  23. echo.如果加的^个数是偶数2k就相当与转换成k个普通的符号^没有转义的意思,如果加的^个数是奇数2k+1就相当与前2k转换成k个普通的^而最后个为转义字符
  24. echo.
  25. echo.
  26. echo 以下是偶数的效果
  27. set "a=echo 12345&echo ^^^^123"
  28. %a%
  29. pause
  30. echo 以下是奇数的效果
  31. set "a=echo 12345&echo ^^^123"
  32. %a%
  33. pause
  34. echo.
  35. echo.
  36. echo 接下来是''与""中^的区别
  37. echo.
  38. echo.
  39. echo 如果特殊符号在''单引号中则全部的特殊符号都得加上转义符号
  40. echo.
  41. echo.
  42. echo ''单引号中加入转义符号的效果
  43. for /f "delims=" %%a in ('ipconfig /all^|findstr /i "ip"') do echo %%a
  44. pause>nul
  45. echo.
  46. rem echo ''单引号中不加入转义符号的效果
  47. rem for /f "delims=" %%a in ('ipconfig /all|findstr /i "ip"') do echo %%a
  48. rem pause>nul(执行出错)
  49. echo 普通时候不需要考虑转义情况(指没有""双引号,单引号'')
  50. ipconfig /all|findstr /i "ip"
  51. pause>nul
  52. echo.
  53. echo 单引号的应用举例1
  54. for /f %%a in ('^(echo 1234^&echo 435648^&echo 43123^)^|findstr  "123"^|findstr "43"') do echo %%a
  55. pause>nul
  56. echo.
  57. echo 单引号的应用举例2
  58. echo.
  59. for /f %%a in ('^(echo 1234^&echo 5648^&echo 4312^)^|findstr  "12"^|findstr "34"') do echo %%a
  60. pause>nul
  61. echo.看看以下进度条...区别就在其中了
  62. echo 引号类循环..................进度
  63. set "a=set /p=■<nul&ping/n 1 127.1 >nul"
  64. echo.
  65. echo  程序正在初始化. . .
  66. echo.
  67. for /l %%i in (0 1 39) do %a%
  68. pause>nul
  69. @echo off
  70. title 初始化进行中
  71. color 1f
  72. echo 在双引号内的特殊符号不需要加转义符号(相当于默认就加上了)
  73. set "a=set /p=■<nul&ping/n 1 127.1 >nul&"
  74. echo.
  75. echo  程序正在初始化. . .
  76. echo.
  77. %a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%
  78. pause>nul
  79. @echo off
  80. title 初始化进行中
  81. color 1f
  82. echo 为了echo显示内容在引用set的变量是我们必须使用转义符号把符号转换成普通含义
  83. set a=set /p=■^<nul^&ping/n 1 127.1 ^>nul^&
  84. echo.
  85. echo  程序正在初始化. . .
  86. echo.
  87. %a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%
  88. pause>nul
  89. @echo off
  90. title 初始化进行中
  91. color 1f
  92. echo 先输出空格...再逐一替换...........
  93. set a=set /p=■^<nul^&ping/n 1 127.1 ^>nul^&
  94. echo.
  95. echo  程序正在初始化. . .
  96. echo.
  97. set/p=  <nul&%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%
  98. echo   100%%
  99. pause>nul
复制代码

我写这个教程是为了让更多初学者少走弯路....欢迎高手们指正问题.............................
菜鸟发贴,欢迎大家发现问题,好及时改正.

[ 本帖最后由 woxingwoshu007 于 2009-4-22 21:35 编辑 ]
作者: Batcher    时间: 2009-4-22 21:21

第一次发,不知道怎么格式才好


红色代码看着太刺眼,能否改成黑色?

高手们绕道


万一哪位“高手”想给你指出一些问题怎么办?绕到哪里去?
作者: zqz0012005    时间: 2009-4-22 21:31

楼主有意思哦。。。
“echo 在搜索百度.goole及相关批论坛均无发现....”
在别的论坛发帖求助得到答案,别的论坛也有相关文章,居然说“均无发现”?

而且那个求助帖状态还是[未解决](不只一个帖子是这样)。

我并不是为那个论坛叫屈(哪个论坛对我来说都一样),只是觉得楼主这种行为有点不妥。
作者: woxingwoshu007    时间: 2009-4-22 21:34     标题: 回复 3楼 的帖子

晕..其中有一个帖子求助的就是我自己(我为了这个问题一开始多方求助..汗颜).....谢谢提议以后会改正

[ 本帖最后由 woxingwoshu007 于 2009-4-22 21:36 编辑 ]
作者: woxingwoshu007    时间: 2009-4-22 21:38     标题: 回复 2楼 的帖子

太喜欢你了..巡查..每次我发贴都会收到你的指教..我虚心接受...我开心我快乐在这里成长学习ing..................顶batcher
作者: batman    时间: 2009-4-22 21:41

我来帮楼主说两句(并不是因为楼主尊称我为师傅,汉。。。):
    第一、我认为楼主这种肯于钻研的精神是极为可嘉的,现在很多新手学东西就是缺少这股子钻劲;
    第二、楼主整理出来的这篇贴子还是具有实际意义的,里面的内容我觉得才是我们应该讨论的;
    第三、至于楼主所触犯的论坛规则,还请楼主及时改正;
    第四、对于新人我们应给予更多的是鼓励和引导,而不是义正严辞的批评。
作者: woxingwoshu007    时间: 2009-4-22 21:47     标题: 回复 6楼 的帖子

嗯..我只是希望自己能够学好知识..当然也能帮助到别人....欢迎一切指正我虚心接受
作者: 634175535    时间: 2010-4-22 10:24

说真的我真没有看懂呐!
作者: 随风    时间: 2010-4-22 10:43

在搜索百度.goole及相关批论坛均无发现....

这句话好像确实有点不太妥,建议改改,事实上相关话题其他论坛曾经有过更深入讨论
我记得好像是“非常批处理”论坛的某个教程,具体链接一时找不到了。
作者: willowc    时间: 2010-4-23 19:37

收藏了……我以前在研究过转义字符,觉得比较吃力
作者: sxw    时间: 2011-6-28 19:46

运行出错了,[code]C:\Documents and Settings\Administrator\桌面>...鍐嶉
作者: 931805085    时间: 2012-1-19 17:52

这些东西我原来都没注意到,谢啦
作者: cjiabing    时间: 2012-1-19 23:39

本帖最后由 cjiabing 于 2012-1-19 23:46 编辑

回复 12# sxw


    万恶的搜狗输入法!

    说实在的,这些东西很常见,没什么特殊的。
    在For中,一些引号在usebackq的规则下功能被改变,原来双引号在for中用来解析字符串,使用Usebackq后专门用来解析带空格的路径,而单引号则被用来解析字符串,而通常单引号在FOR中是用来执行命令的。
   
  1. @echo off
  2. for /f "tokens=1 delims=[]" %%a in ('cmd /c "wmic process where name="cmd.exe" get CommandLine" ^| find /i "%~f0" ^| find /i /n "%~f0"') do set /a num=%%a-1
  3. echo 本程序一共打开了 %num% 个。
  4. pause
复制代码


  1. @echo off
  2. set "v=&|"
  3. for /f "tokens=*" %a in ("%v%") do echo;%a
复制代码

双引号会强力终止各种符号的作用,而直接显示它们。当然,这里面可能用了两对双引号,其他一些字符,以及一些特殊情况的组合会导致双引号失效,这里就不举例了。
给你看看一个最变态的:
  1. @echo off
  2. for /f "tokens=2,10 delims=: " %%a in ('"Tasklist /v  /fi "IMAGENAME eq cmd.exe" /FO TABLE /NH"') do (
  3.     if /i %%b==BatMPlayerSearch  Taskkill /f /t /pid %%a
  4. )
  5. ::外面加了两层,最外层的是单引号,里层的是双引号,里层使用双引号的目的就是为了消除"IMAGENAME eq cmd.exe"这对双引号导致的错误!
  6. pause
复制代码





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