Board logo

标题: [原创] 批处理常用符号详解 [打印本页]

作者: namejm    时间: 2008-7-13 14:26     标题: 批处理常用符号详解

这是一篇针对批处理中常用符号的详细解释,每个符号都有解释及相应的举例,希望通过比较系统的讲述,能让新手尽快入门。

  在这篇帖子中,我对常用符号的讲解做如下限定:
  1、收集批处理中经常用到的符号;
  2、每个常用符号,只讲述最常用的功能;深入的用法留待将来介绍;
  这样限定的原因,一是让新手系统地接触最常用符号的常用功能,不至于一开始就陷入技术细节中难以自拔;二是有些符号的用法非常罕见,没有特定的需求可以忽略掉,比如句柄复制符号;三是有些高深的内容本人也没有完全消化,只解说一鳞半爪难免会误人子弟,比如 set /a 中的^、!等符号;

  如有遗漏或谬误,请大家及时跟帖,帮忙修正。
————————————————————————————————————————————

1、@
  一般在它之后紧跟一条命令或一条语句,则此命令或语句本身在执行的时候不会显示在屏幕上。请把下面的代码保存为test.cmd文件,然后运行,比较一下两条echo语句在屏幕上的输出差异:
  1. echo a
  2. @pause
  3. @echo b
  4. @pause
复制代码
执行结果如下:
C:\Documents and Settings\JM\桌面>echo a
a
请按任意键继续...
b
请按任意键继续...


2、%、%%
  百分号用在不同的场合,有不同的含义:
  ① 当百分号成对出现,并且其间包含非特殊字符时,一般做变量引用处理,比如:%var%、%str%。把以下代码保存为批处理文件,运行后观察屏幕显示结果:
  1. @echo off
  2. set str=abc
  3. echo 变量 str 的值是: %str%
  4. pause
复制代码
在屏幕上将显示这样的结果:
变量 str 的值是: abc
按任意键继续...

  另外,百分号作为变量引用还有一种特殊形式,那就是对形式参数的引用,此时,单个百分号后面紧跟0~9这10个数字,如%0、%1,请看演示代码:
  1. @echo off
  2. if defined str goto next
  3. set str=
  4. set /p str=请把文件拉到本窗口后回车:
  5. call "%~0" %str%
  6. pause
  7. exit
  8. :next
  9. cls
  10. echo 本批处理文件完整路径为:"%~0"
  11. echo 拖到本窗口的文件完整路径为:"%~1"
  12. goto :eof
复制代码
② 出现在 set /a 语句中时,表示两数相除取余数,也就是所谓的模运算,它在命令行窗口和批处理文件中的写法略有差异:在命令行窗口中,只需要单个的%,在批处理文件中,需要连续两个百分号,写成%%。
  例如:在命令行窗口中,运行 set /a num=4%2 ,则结果将显示0,因为4除以2的余数为0;如果保存为批处理文件,则此语句将略有改变:
  1. @echo off
  2. set /a num=4%%2
  3. echo 4除以2的余数为 %num%
  4. pause
复制代码
③ 转义符号:如果要显示%本身时,需要在前面用%来转义。例如:
  1. @echo off
  2. echo 一个百分号:%%
  3. echo 两个百分号:%%%%
  4. echo 三个百分号:%%%%%%
  5. pause
复制代码
3、:、::
  ① 以:打头的单个的:表示该行是一个标签,它之后的内容是一个标签段,如:test,则表示:test之下的内容是标签段,而test是这个标签段的名,可以用 goto test 、goto :test 跳转到该标签段或用 call :test 调用该子过程;而连续两个冒号打头表示该行内容为注释内容,实际上,:: 是个无效的标签名,:加上空格同样可以起到注释的作用,此时,::的功能和注释命令rem相同;但是,rem 注释语句中的某些命令符号如重定向符号和管道符号还是会执行,而如果用::来注释的时候,与::同处一行的所有命令或符号直接被命令解释器忽略掉,无形中提高了注释的兼容性和整个程序的执行效率,并且在众多的命令语句中更显得醒目,所以,注释语句推荐使用::的格式。
  ② 在 set 语句中:和~同时使用时,: 起到截取字符串的功能。假设 set str=abcde,那么,set var=%str:~0,1% 表示截取字符串abcde的第一个字符;和=同时使用时,起到替换字符串的功能。假设:set str=abc:de,那么,set var=%str:a=1% 则表示把字符串abc:de中的a替换为1,set var=%str::=2% 则表示把字符串abc:de中的:替换为2;

4、~
  ① 用在 set 语句中,和:同时使用时,起到截取字符串的功能,请参考上一条的解释;
  ② 用在 set /a 语句中时,它是一元运算符号,表示将操作数字按位取反,例如,set /a num=~1的执行结果是-2,set /a num=~0的结果是-1
  ③ 用在for语句中,表示增强for的功能,能够提取到更多的信息。例如:在批处理文件的for语句中:%%~i表示去掉第一对外侧引号,%%~zi表示获取文件的大小(以字节为单位),%%~ni表示获取文件名,%%~xi表示获取扩展名(带点号)……它们可以组合使用,如%%~nxi表示获取文件名和后缀名。

5、>、>>
  一般而言,>表示用新内容覆盖原文件内容,>>表示向原文件追加内容,此时,它们以重定向符号的身份出现;如果用在 set /a 语句中,则>表示分组,>>表示逻辑移位;

6、|
  一般而言,它以管道符号的身份出现,表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,简而言之,就是把它之前的输出作为它之后的输入,例如:echo abcd|findstr "b",表示把echo abcd的执行结果,作为findstr "b" 的执行对象,也就是在字符串abcd中查找b字符;如果test.txt中有abcd字符串,则该语句与 findstr "b" test.txt 具有同样的效果;

7、^
  一般而言,^以转义字符的身份出现。因为在cmd环境中,有些字符具备特殊功能,如>、>>表示重定向,|表示管道,&、&&、||表示语句连接……它们都有特定的功能,如果需要把它们作为字符输出的话,echo >、echo | ……之类的写法就会出错——cmd解释器会把它们作为具有特殊功能的字符对待,而不会作为普通字符处理,这个时候,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^,因此,要输出这些特殊字符,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之类的格式来处理;

8、&
  一般而言,&表示两条命令或语句同时执行的意思。如 echo a&echo b,将在屏幕上同时显示a和b字符。当几条语句含义近似或作用相同且没有先后的顺序之别时,启用&符号连接这些语句将会增加程序的可读性;

9、&&、||
  这是一对含义截然相反的命令符,&&表示如果它之前的语句成功执行,将执行它之后的语句,而||则表示如果它之前的语句执行失败,将执行它之后的语句;在某些场合,它们能替代 if……else…… 语句;例如:
  1. @echo off
  2. md test&&echo 成功创建文件夹test||echo 创建文件夹test失败
  3. pause
复制代码
效果等同于如下代码:
  1. @echo off
  2. md test
  3. if "%errorlevel%"=="0" (echo 成功创建文件夹test) else echo 创建文件夹test失败
  4. pause
复制代码
10、()
  小括号对经常出现在for语句和if语句中,还有一些特定场合;在for和if语句中属于语句格式的要求,例如:
  ① for %%i in (语句1) do (语句2):在这条语句中,语句1必须用括号对包围,而语句2的括号对则可视情况予以抛弃或保留:如果语句2是单条语句或用&、&&、||等连接符号连接的多条语句,括号对可以抛弃,如果语句2是有逻辑先后关系的多条语句集合,则必须保留括号对,并且,多条语句必须断行书写;例如:
  1. @echo off
  2. for %%i in (a b c) do echo %%i&echo --------
  3. pause
复制代码
也可以改写为:
  1. @echo off
  2. for %%i in (a b c) do (
  3.     echo %%i
  4.     &echo --------
  5. )
  6. pause
复制代码
② if 条件 (语句1) else (语句2):如果没有else部分,则语句1的括号对可有可无;如果有else部分,则语句1中的括号对必须保留,此时,语句2中的括号对保留与否,和上一点类似。例如:
  1. @echo off
  2. if exist test.txt echo 当前目录下有test.txt
  3. pause
复制代码
  1. @echo off
  2. if exist test.txt (echo 当前目录下有test.txt) else echo 当前目录下没有test.txt
  3. pause
复制代码
  1. @echo off
  2. if exist test.txt (echo 当前目录下有test.txt) else (
  3.     echo 当前目录下没有test.txt
  4.     pause
  5.     cls
  6.     echo 即将创建test.txt文件
  7.     cd.>test.txt&&echo 成功创建test.txt
  8. )
  9. pause
复制代码
③ 特定场合下使用括号对,不但可以使代码逻辑清晰,增强可读性,还可能会减少代码量。比如用echo语句构造多行文本内容的时候:
  1. @echo off
  2. (
  3. echo 第一行
  4. echo 第二行
  5. echo 第三行
  6. )>test.txt
  7. start test.txt
复制代码
如果不使用括号对的话,则需要使用如下代码:
  1. @echo off
  2. echo 第一行>test.txt
  3. echo 第二行>>test.txt
  4. echo 第三行>>test.txt
  5. start test.txt
复制代码
11、+、-、*、/
  在 set /a 语句中,这些符号的含义分别为:加、减、乘、除。例如:set /a num=1+2-3*4/5。需要注意的是,这些运算符号遵循数学运算中的优先级顺序:先乘除后加减,有括号的先算括号,并且,直接忽略小数点,因此,刚才那个算式的结果是1而不是0或0.6。
  另外,有可能会在代码中看到这样的写法:set /a num+=1、set /a num-=1、set /a num*=1 和 set /a num/=1,这些表示累加、累减、累乘、累除,步长都是1,展开后的完整写法为:set /a num=num+1、set /a num=num-1、set /a num=num*1 和 set /a num=num/1(set /a 语句中,变量引用可以忽略百分号对或感叹号对,set /a num=%num%+1 与 set /a num=num+1 等同)

12、equ、neq、lss、leq、gtr、geq
  这几个命令符是if语句中常用到的数值比较符号,取自英文的关键字母,具体的含义为:
命令符号        含义                英文解释
EQU                等于                equal
NEQ                不等于                 not equal
LSS                少于                 less than
LEQ                少于或等于         less than or equal
GTR                大于                 greater than
GEQ                大于或等于         greater than or equal

作者: night    时间: 2008-9-24 23:01     标题: 请教

不错啊,很受用。只是有些语法似乎没啥规律啊,像这一句:
假设:set str=abc:de,那么,set var=%str:a=1% 则表示把字符串abc:de中的a替换为1,set var=%str::=2% 则表示把字符串abc:de中的:替换为2;
我不知该怎么记啊,所以用也还得查……
作者: yslyxqysl    时间: 2008-9-29 21:49

!!!!
!!!!!
!!!!
!!!

!!

!


!

叹号去哪了??!!


作者: wuzhihui001    时间: 2008-10-26 18:48

我也不知道在哪里问  索性就在这里问得了  哪位朋友能告诉我怎么输入这符号啊  谢谢
作者: hkmhd    时间: 2008-11-6 13:40

增加了不少的知识,仅仅是符号就要学那么多……批处理这玩意也还真是不一般
作者: Batcher    时间: 2009-1-4 00:13     标题: 回复 8楼 的帖子

就是把等号左边的字符串替换为等号右边的字符串
环境变量替换已如下增强:

    %PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

作者: Batcher    时间: 2009-1-4 00:14     标题: 回复 14楼 的帖子

ALT+小键盘127 backspace 
Ctrl+G beep 
作者: hongznbiao    时间: 2009-2-10 00:40     标题: 楼主辛苦了

感谢楼主的帮助.我是最近才开始学习"入门"的.
作者: guao_jie    时间: 2009-3-26 21:37

顶顶顶顶顶顶顶,谢谢。
作者: gaoren1dian    时间: 2009-3-29 09:27

好猛好强大,楼主,学习学习
作者: yjstone    时间: 2009-3-29 20:58

非常好,但是~解释得不是很详细,比如"%~0"的意思,还有!符号还没有说明是什么意思,还望楼主解答。
作者: Batcher    时间: 2009-3-29 22:15     标题: 回复 29楼 的帖子

!
① 在set /a中一元运算符,表示逻辑非。比如set /a a=!0,这时a就表示逻辑1。

! !
① 当启用变量延迟时,使用!!将变量名扩起来表示对变量值的引用。
作者: Batcher    时间: 2009-4-1 11:46     标题: 转帖:批处理中符号的作用

  1.             一、单符号
  2. ~
  3. ① 在for中表示使用增强的变量扩展。
  4. ② 在%var:~n,m%中表示使用扩展环境变量指定位置的字符串。
  5. ③ 在set/a中表示一元运算符,将操作数按位取反。
  6. !
  7. ① 在set /a中一元运算符,表示逻辑非。比如set /a a=!0,这时a就表示逻辑1。
  8. @
  9. ① 隐藏命令行本身的回显,常用于批处理中。
  10. $
  11. ① 在findstr命令里面表示一行的结束。
  12. ② 在prompt命令里面,表示将其后的字符转义(符号化或者效果化)。
  13. %
  14. ① 在set /a中的二元运算符,表示算术取余。
  15. ② 命令行环境下,在for命令in前,后面接一个字符(可以是字母、数字或者一些特定字符),表示指定一个循环或者遍历指标变量。
  16. ③ 批处理中,后接一个数字表示引用本批处理当前执行时的指定的参数。
  17. ④ 其它情况下,%将会被脱去(批处理)或保留(命令行)
  18. ^
  19. ① 取消特定字符的转义作用,比如& | > < ! "等,但不包括%。比如要在屏幕显示一些特殊的字符,比如> >> | ^ &等符号时,就可以在其前面加一个^符号来显示这个^后面的字符了,^^就是显示一个^,^|就是显示一个|字符了;
  20. ② 在set/a中的二元运算符,表示按位异或。
  21. ③ 在findstr/r的[]中表示不匹配指定的字符集。
  22. &
  23. ① 命令连接字符。比如我要在一行文本上同时执行两个命令,就可以用&命令连接这两个命令。
  24. ② 在set/a中是按位与。
  25. *
  26. ① 代表任意个任意字符,就是我们通常所说的"通配符";比如想在c盘的根目录查找c盘根目录里所有的文本文件(.txt),那么就可以输入命令"dir c:\*.txt"。
  27. ② 在set /a中的二元运算符,表示算术乘法。
  28. ③ 在findstr/r中表示将前一个字符多次匹配。
  29. -
  30. ① 范围表示符,比如日期的查找,for命令里的tokens操作中就可以用到这个字符。
  31. ② 在findstr/r中连接两个字符表示匹配范围。
  32. ③ -跟在某些命令的/后表示取反向的开关。
  33. ④ 在set /a中:
  34.    1.表示一个负数。
  35.    2.表示算术减运算。
  36. +
  37. ① 主要是在copy命令里面会用到它,表示将很多个文件合并为一个文件,就要用到这个+字符了。
  38. ② 在set/a中的二元运算符,表示算术加法。
  39. :
  40. ① 标签定位符,表示其后的字符串为以标签,可以作为goto命令的作用对象。比如在批处理文件里面定义了一个":begin"标签,用"goto begin"命令就可以转到":begin"标签后面来执行批处理命令了。
  41. ② 在%var:string1=string2%中分隔变量名和被替换字串关系。
  42. |
  43. ① 管道符,就是将上一个命令的输出,作为下一个命令的输入."dir /a/b |more"就可以逐屏的显示dir命令所输出的信息。
  44. ② 在set/a中的二元运算符,表示按位或。
  45. ③ 在帮助文档中表示其前后两个开关、选项或参数是二选一的。
  46. /
  47. ① 表示其后的字符(串)是命令的功能开关(选项)。比如"dir /s/b/a-d"表示"dir"命令指定的不同的参数。
  48. ② 在set/a中表示除法。
  49. >
  50. ① 命令重定向符,将其前面的命令的输出结果重新定向到其后面的设备中去,后面的设备中的内容被覆盖。比如可以用"dir > lxmxn.txt"将"dir"命令的结果输出到"lxmxn.txt"这个文本文件中去。
  51. ② 在findstr/r中表示匹配单词的右边界,需要配合转义字符\使用。
  52. <
  53. ① 将其后面的文件的内容作为其前面命令的输入。
  54. ② 在findstr/r中表示匹配单词的左边界,需要配合转义字符\使用。
  55. =
  56. ① 赋值符号,用于变量的赋值。比如"set a=windows"的意思意思是将"windows"这个字符串赋给变量"a"。
  57. ② 在set/a中表示算术运算,比如"set /a x=5-6*5"。
  58. \
  59. ① 这个"\"符号在有的情况下,代表的是当前路径的根目录.比如当前目录在c:\windows\system32下,那么你"dir \"的话,就相当与"dir c:\"。
  60. ② 在findstr/r中表示正则转义字符。
  61. ,
  62. ① 在set /a中表示连续表达式的分割符。
  63. ② 在某些命令中分割元素。
  64. .
  65. ① 在路径的\后紧跟或者单独出现时:
  66.    一个.表示当前目录。
  67.    两个.表示上一级目录。
  68. ② 在路径中的文件名中出现时:
  69.    最后的一个.表示主文件名与扩展文件名的分隔。
  70. ?
  71. ① 在findstr/r中表示在此位置匹配一个任意字符。
  72. ② 在路径中表示在此位置通配任意一个字符。
  73. ③ 紧跟在/后表示获取命令的帮助文档。
  74. ___________________________________________________
  75.             二、多符号(符号不能分隔)
  76. &&
  77. ① 连接两个命令,当&&前的命令成功时,才执行&&后的命令。
  78. ||
  79. ① 连接两个命令,当||前的命令失败时,才执行||后的命令。
  80. >&
  81. ① 将一个句柄的输出写入到另一个句柄的输入中。
  82. <&
  83. ① 从一个句柄读取输入并将其写入到另一个句柄输出中。
  84. %%
  85. ① 两个连续的%表示在预处理中脱为一个%。
  86. ② 批处理中,在for语句的in子句之前,连续两个%紧跟一个字符(可以是字母、数字和一些特定字符),表示指定一个循
  87. 环或者遍历指标变量。
  88. ③ 批处理中,在for语句中,使用与in之前指定的指标变量相同的串,表示引用这个指标变量。
  89. >>
  90. ① 命令重定向符,将其前面的命令的输出结果追加到其后面的设备中去。
  91. ② 在set /a中的二元运算符,表示逻辑右移。
  92. ==
  93. ① 在if命令中判断==两边的元素是否相同。
  94. <<
  95. ① 在set /a中的二元运算符,表示逻辑左移。
  96. +=
  97. ① 在set /a中的二元运算符。例如set /a a+=b表示将a加上b的结果赋值给a。
  98. -=
  99. ① 在set /a中的二元运算符。例如set /a a-=b表示将a减去b的结果赋值给a。
  100. *=
  101. ① 在set /a中的二元运算符。例如set /a a*=b表示将a乘以b的结果赋值给a。
  102. /=
  103. ① 在set /a中的二元运算符。例如set /a a/=b表示将a加上b的结果赋值给a。
  104. %=
  105. ① 在set /a中的二元运算符。例如set /a a%=b表示将a除以b的余数赋值给a。
  106. 【注:命令行可以直接用 set /a a%=b ,在批处理里面可以用 set /a a%%=b 。】
  107. ^=
  108. ① 在set /a中的二元运算符。例如set /a a"^="b表示将a与b按位异的结果赋值给a。
  109. 【注:这里 "^=" 加引号是为了防止^被转义,下同。】
  110. &=
  111. ① 在set /a中的二元运算符。例如set /a a"&="b表示将a与b按位与的结果赋值给a。
  112. |=
  113. ① 在set /a中的二元运算符。例如set /a a"|="b表示将a与b按位或的结果赋值给a。
  114. <<=
  115. ① 在set /a中的二元运算符。例如set /a a"<<="b表示将a按位左移b位的结果赋值给a。
  116. >>=
  117. ① 在set /a中的二元运算符。例如set /a a">>="b表示将a按位右移b位的结果赋值给a。
  118. \<
  119. ① 在findstr的一般表达式中表示字的开始处。
  120. \>
  121. ① 在findstr的一般表达式中表示字的结束处。
  122. ___________________________________________________
  123.             三、双符号对(两个符号之间须指定字符串)
  124. ! !
  125. ① 当启用变量延迟时,使用!!将变量名扩起来表示对变量值的引用。
  126. ' '
  127. ① 在for/f中表示将它们包含的内容当作命令行执行并分析其输出。
  128. ② 在for/f "usebackq"中表示将它们包含的字符串当作字符串分析。
  129. ( )
  130. ① 命令包含或者是具有优先权的界定符,比如for命令要用到这个(),我们还可以在if,echo等命令中见到它的身影。
  131. ② 在set /a中表示表达式分组。
  132. " "
  133. ① 界定符,在表示带有空格的路径时常要用""来将路径括起来,在一些命令里面也需要" "符号。
  134. ② 在for/f中将表示它们包含的内容当作字符串分析。
  135. ③ 在for/f "usebackq"表示它们包含的内容当作文件路径并分析其文件的内容。
  136. ④ 在其它情况下表示其中的内容是一个完整的字符串,其中的>、>>、<、&、|、空格等不再转义。
  137. ` `
  138. ① 在for/f中表示它们所包含的内容当作命令行执行并分析它的输出。
  139. % %
  140. ① 使用两个单独的%包含一个字符串表示引用以此串为名的环境变量。比如一个%time%可以扩展到当前的系统时间。
  141. [ ]
  142. ① 在帮助文档表示其中的开关、选项或参数是可选的。
  143. ② 在findstr /r中表示按其中指定的字符集匹配。
复制代码
原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=30985

[ 本帖最后由 Batcher 于 2009-4-1 11:50 编辑 ]
作者: wangjmh    时间: 2009-4-2 22:19     标题: 补充一些符号

\
这个"\"符号在有的情况下,代表的是当前路径的根目录.比如当前目录在c:\windows\system32下,那么你"dir \"的话,就相当与"dir c:\"
在findstr/r中表示正则转义字符。

''
在for/f中表示将它们包含的内容当作命令行执行并分析其输出;
在for/f "usebackq"中表示将它们包含的字符串当作字符串分析。
.
\\
在路径的\后紧跟或者单独出现时:
     一个.表示当前目录;
     两个.表示上一级目录;
在路径中的文件名中出现时:
     最后的一个.表示主文件名与扩展文件名的分隔。
$
\\在findstr命令里面表示一行的结束。
``
在for/f中表示它们所包含的内容当作命令行执行并分析它的输出。
[]
在帮助文档表示其中的开关、选项或参数是可选的;
在findstr/r中表示按其中指定的字符集匹配。
?
在findstr/r中表示在此位置匹配一个任意字符;
?在路径中表示在此位置通配任意一个字符;
紧跟在/后表示获取命令的帮助文档。
!
当启用变量延迟时,使用!!将变量名扩起来表示对变量值的引用;
在set /a中表示逻辑非。比如set /a a=!0,这时a就表示逻辑1
作者: Agan    时间: 2009-4-7 13:19

如输出%
可以用%%形式,还可以^%。那请问有什么区别吗?
作者: Batcher    时间: 2009-4-7 14:31     标题: 回复 37楼 的帖子

可以先自己看看有什么区别:
  1. @echo off
  2. echo %%
  3. pause
  4. echo ^%
  5. pause
复制代码

作者: freeback    时间: 2009-5-8 02:09

batcher的转帖中应该付上示例,就更能吸收了,有些命令如果没有示例理解上就有些困难,甚至会出现知道命令,却不知道怎么用的结果。
作者: Batcher    时间: 2009-5-8 09:48     标题: 回复 40楼 的帖子

你如果感兴趣的话,可以为每个用法写个实例,利人利己,还会收到红包。
^_^
作者: h168855858    时间: 2009-5-17 22:51

整理成TXT文档
作者: h168855858    时间: 2009-5-17 22:53

这个是集合了那2位回复的。。。
作者: xiaomao_kl    时间: 2009-9-29 11:11

刚学批处理,请问下楼主
  
      @echo off
for %%i in (a b c) do echo %%i&echo --------
pause

    这段代码里的          %%i    表示什么意思?  是本来规定这样写还是可以改?
作者: Snokis    时间: 2009-12-12 18:34

怎么没有“.”呢?就是英文的句号

我对
CD..
这条命令不明白,想找找“.”是什么意思,而且还连续用了俩,
但是在这儿没找到哇
我是菜鸟,请指教下哈
作者: yuexfz    时间: 2010-8-4 08:48

学习学习拉!!!
作者: puzhijie    时间: 2010-11-29 16:05     标题: 帅这就是我想要的谢谢搂主啊

帅这就是我想要的谢谢搂主啊
作者: LJanswer    时间: 2010-12-13 15:47

这里真是学习的好地方!
作者: sy78wpl    时间: 2010-12-25 13:37     标题: 请高手为这个代码写一段注释,我不能理解

@echo off&setlocal enableDelayedExpansion
for /f "usebackq tokens=1* delims=. " %%a in ("list.txt") do set #%%a=%%b
for %%f in (*.cue) do (
(for /f "usebackq delims=" %%a in ("%%f") do (
        set a=%%a
        set a=!a: =!
        if /i not "!a:~0,11!!a:~-1!"=="TITLE"Track"" (
            echo %%a
        ) else (
            for %%b in (!a:~-3^,2!) do echo     TITLE "%%b.!#%%b!"
        )
    ))>han.ye
    move "han.ye" "%%f"
作者: cainkl    时间: 2011-3-8 09:19

原帖由 Batcher 于 2009-1-4 00:14 发表
ALT+小键盘127 backspace 
Ctrl+G beep 
打出来的不一样啊  跪求解释  另外这个符号有啥作用啊 谢谢
作者: bluefox306    时间: 2011-3-10 15:24

好好学习一下,多了解一下
作者: jay_16    时间: 2011-4-1 22:22

怎么截取关闭cmd窗口的消息并做一些动作?
作者: lomo_mo    时间: 2011-4-19 09:32

谢谢楼主这个教程的分享
作者: dcybt    时间: 2011-4-21 17:31

学习了。。。
作者: ttxifu    时间: 2011-5-9 09:23

让我在学习学习
作者: coldsummerwei    时间: 2012-1-30 18:22

③ 转义符号:如果要显示%本身时,需要在前面用%来转义。

文章中%符号的第3种用法,只适合批处理文件中(例子那样),在命令行窗口中,%只是一般字符,直接写即可。当然^%这样写也正确。所以转义字符^,它不论在命令行窗口还是批处理文件中,都可以表示转义,既可以转义“<、>、|”等特殊字符,也可以转义“1、a、%”等一般字符。
而%符号在批处理文件中比较特殊,如果要显示%本身,得%%这样写。又如for循环中的变量%I(命令行窗口里)在批处理文件中必须得表示成%%I。
作者: cjiabing    时间: 2012-1-31 17:18

回复 34# coldsummerwei


    不要那么纠结于这个%,它在不同地方有不同表示,但表示的不是它本身意思,而是其他意思。
    在FOR中表示变量,批处理中用%%a,cmd中用%a。
    在变量中标记变量,如%var%。在有些复杂的变量中,你只需在两边多加%,如echo echo %%abcd%%>>123.txt
    在显示%自身时,要么用转义符^%,要么成双成对%%。
    因为单个%号会被消掉——脱掉,使用时记得要成对使用。
    在一些变量中:call   :calc  %var:~!num!,2%
    表示文件的特定属性,文件名%~n1、文件路径%~dp1等,在FOR中也可以%%~nxa、%~fa。
    计算时取余数,记得有,但没做过。
    其他的也不过如此。
作者: wodesitanfu    时间: 2012-8-15 11:59

回复 26# sy78wpl
  1. @echo off&setlocal enableDelayedExpansion
  2. for /f "usebackq tokens=1* delims=. " %%a in ("list.txt") do set #%%a=%%b
  3. for %%f in (*.cue) do (
  4. (for /f "usebackq delims=" %%a in ("%%f") do (
  5.         set a=%%a
  6.         set a=!a: =!
  7.         if /i not "!a:~0,11!!a:~-1!"=="TITLE"Track"" (
  8.             echo %%a
  9.         ) else (
  10.             for %%b in (!a:~-3^,2!) do echo     TITLE "%%b.!#%%b!"
  11.         )
  12.     ))>han.ye
  13.     move "han.ye" "%%f"
复制代码
这是我目前看到的最头疼,还看不懂
for /f "usebackq tokens=1* delims=. " %%a in ("list.txt") do set #%%a=%%b
#号是做什么用的??为什么要用usebakq,list.txt并没有空格符号,个人习惯?
   if /i not "!a:~0,11!!a:~-1!"=="TITLE"Track"" 真心没看懂,中间那两个!!号是做什么?title tracker为什么4个引号? 同样的,"%%b.!#%%b!" 也没看懂,应该是个文件名,但#号做什么的?
     for %%b in (!a:~-3^,2!) 为什么要用转意符?
如果这人不是写错了或者为了彰显技术而故意复杂化,那这人真的是个高高高高手。
作者: kkfgef    时间: 2012-8-16 19:02

这个得收藏!
作者: tianya1988    时间: 2012-8-21 23:12

本帖最后由 tianya1988 于 2012-8-21 23:18 编辑

回复 36# wodesitanfu
我也是个半桶水,如有错误还请指正,一起来学习
1.
  1. for /f "usebackq tokens=1* delims=. " %%a in ("list.txt") do set #%%a=%%b
复制代码
这个#感觉好像就是当作个普通字符  假设for循环过程中的%%a取得的变量这为abc,那么set #%%a=%%b就表示定义一个变量“#abc”
2.
usebakq么,个人感觉既是习惯也是推荐用法吧
3.
  1. "!a:~0,11!!a:~-1!"=="TITLE"Track""
复制代码
这个不应该看成是两个叹号,而是前后两个“!!”变量引用符,即!a:~0,11!和!a:~-1!,然后把两个字符串连接起来了,假设现在a变量表示字符串“0123456789abcdef”,那么!a:~0,11!表示的是字符串“0123456789ab”,!a:~-1!表示的是字符f,连接起来!a:~0,11!!a:~-1!表示的就是“0123456789abf”这么个字符串。
至于后面的四个引号,你可以把等式两边同时脱去外层引号来看,就是判断左边的字符串,如上面的“0123456789abf”是不是和TITLE"Track"相同
4.
  1. "%%b.!#%%b!"
复制代码
这个应该和第一步定义set #%%a=%%b相关,这时候用到了,要不然开始你看第一个for循环好像没什么意义
5.
  1. for %%b in (!a:~-3^,2!)
复制代码
个人感觉,转义要不要无所谓,但我知道for循环里出现管道命令|一定要用转义符
作者: 猪猪你个羊羊    时间: 2012-9-21 16:36

相当实用的,谢谢楼主!收下了
作者: web    时间: 2012-10-15 21:18

增加了不少的知识
作者: jakorzhang    时间: 2012-10-16 10:26

内容很全面!希望能加上ctrl+字母的那些特殊符号的讲解 那些属于什么?怎么回显空格 删除键有是那个?
作者: bclcc    时间: 2013-5-28 10:55

for里面引用变量是%%i,但是也有像“echo 变量str的值是:%str%”的变量引用,for里面%%i这样的形式是特例么??
作者: lanshao    时间: 2013-6-2 13:16

真心学习了!
作者: tangqingfu    时间: 2013-6-20 17:24

谢谢楼主的分享!
作者: system_fans    时间: 2013-7-26 16:01

这段时间对批处理非常感兴趣,正好能用上,谢谢版主
作者: system_fans    时间: 2013-7-26 16:24

新手慢慢学习了,
作者: wangx    时间: 2013-7-27 11:03

回复 6# Batcher

管理员你好,有个问题请教一下
@echo off
if defined str goto next
set str=
set /p str=请把文件拉到本窗口后回车:
call "%~0" %str%
pause
exit

:next
cls
echo 本批处理文件完整路径为:"%~0"
echo 拖到本窗口的文件完整路径为:"%~1"
goto :eof

这个batch不理解,对call "%~0" %str% (%~0和后面的%~1是什么意思),
能否把这个batch的执行步骤解释一下,新手刚来,给点温暖吧,谢谢
作者: Batcher    时间: 2013-7-27 11:27

回复 48# wangx


http://bbs.bathome.net/thread-14852-1-1.html
作者: lzyecho    时间: 2014-1-12 02:33

很好,很好,实用,特别是对新手!!!!!!!
作者: xiaopo    时间: 2017-3-7 16:30

%%有遗漏啊
作者: niudd    时间: 2017-3-7 17:34

可以定一下
作者: ai20110304    时间: 2018-5-26 22:31

回复 1# namejm


    受教了




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