执行结果如下:复制代码
- echo a
- @pause
- @echo b
- @pause
C:\Documents and Settings\JM\桌面>echo a
a
请按任意键继续...
b
请按任意键继续...
在屏幕上将显示这样的结果:复制代码
- @echo off
- set str=abc
- echo 变量 str 的值是: %str%
- pause
变量 str 的值是: abc
按任意键继续...
② 出现在 set /a 语句中时,表示两数相除取余数,也就是所谓的模运算,它在命令行窗口和批处理文件中的写法略有差异:在命令行窗口中,只需要单个的%,在批处理文件中,需要连续两个百分号,写成%%。复制代码
- @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
③ 转义符号:如果要显示%本身时,需要在前面用%来转义。例如:复制代码
- @echo off
- set /a num=4%%2
- echo 4除以2的余数为 %num%
- pause
3、:、::复制代码
- @echo off
- echo 一个百分号:%%
- echo 两个百分号:%%%%
- echo 三个百分号:%%%%%%
- pause
效果等同于如下代码:复制代码
- @echo off
- md test&&echo 成功创建文件夹test||echo 创建文件夹test失败
- pause
10、()复制代码
- @echo off
- md test
- if "%errorlevel%"=="0" (echo 成功创建文件夹test) else echo 创建文件夹test失败
- pause
也可以改写为:复制代码
- @echo off
- for %%i in (a b c) do echo %%i&echo --------
- pause
② if 条件 (语句1) else (语句2):如果没有else部分,则语句1的括号对可有可无;如果有else部分,则语句1中的括号对必须保留,此时,语句2中的括号对保留与否,和上一点类似。例如:复制代码
- @echo off
- for %%i in (a b c) do (
- echo %%i
- &echo --------
- )
- pause
复制代码
- @echo off
- if exist test.txt echo 当前目录下有test.txt
- pause
复制代码
- @echo off
- if exist test.txt (echo 当前目录下有test.txt) else echo 当前目录下没有test.txt
- pause
③ 特定场合下使用括号对,不但可以使代码逻辑清晰,增强可读性,还可能会减少代码量。比如用echo语句构造多行文本内容的时候:复制代码
- @echo off
- if exist test.txt (echo 当前目录下有test.txt) else (
- echo 当前目录下没有test.txt
- pause
- cls
- echo 即将创建test.txt文件
- cd.>test.txt&&echo 成功创建test.txt
- )
- pause
如果不使用括号对的话,则需要使用如下代码:复制代码
- @echo off
- (
- echo 第一行
- echo 第二行
- echo 第三行
- )>test.txt
- start test.txt
11、+、-、*、/复制代码
- @echo off
- echo 第一行>test.txt
- echo 第二行>>test.txt
- echo 第三行>>test.txt
- start test.txt
命令符号 含义 英文解释
EQU 等于 equal
NEQ 不等于 not equal
LSS 少于 less than
LEQ 少于或等于 less than or equal
GTR 大于 greater than
GEQ 大于或等于 greater than or equal
!!!!
!!!!!
!!!!
!!!
!!
!
!
叹号去哪了??!!
环境变量替换已如下增强: %PATH:str1=str2% 会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。 要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。 "str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的 开始到 str1 剩余部分第一次出现的地方,都一直保持相配。 |
原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=30985复制代码
- 一、单符号
- ~
- ① 在for中表示使用增强的变量扩展。
- ② 在%var:~n,m%中表示使用扩展环境变量指定位置的字符串。
- ③ 在set/a中表示一元运算符,将操作数按位取反。
- !
- ① 在set /a中一元运算符,表示逻辑非。比如set /a a=!0,这时a就表示逻辑1。
- @
- ① 隐藏命令行本身的回显,常用于批处理中。
- $
- ① 在findstr命令里面表示一行的结束。
- ② 在prompt命令里面,表示将其后的字符转义(符号化或者效果化)。
- %
- ① 在set /a中的二元运算符,表示算术取余。
- ② 命令行环境下,在for命令in前,后面接一个字符(可以是字母、数字或者一些特定字符),表示指定一个循环或者遍历指标变量。
- ③ 批处理中,后接一个数字表示引用本批处理当前执行时的指定的参数。
- ④ 其它情况下,%将会被脱去(批处理)或保留(命令行)
- ^
- ① 取消特定字符的转义作用,比如& | > < ! "等,但不包括%。比如要在屏幕显示一些特殊的字符,比如> >> | ^ &等符号时,就可以在其前面加一个^符号来显示这个^后面的字符了,^^就是显示一个^,^|就是显示一个|字符了;
- ② 在set/a中的二元运算符,表示按位异或。
- ③ 在findstr/r的[]中表示不匹配指定的字符集。
- &
- ① 命令连接字符。比如我要在一行文本上同时执行两个命令,就可以用&命令连接这两个命令。
- ② 在set/a中是按位与。
- *
- ① 代表任意个任意字符,就是我们通常所说的"通配符";比如想在c盘的根目录查找c盘根目录里所有的文本文件(.txt),那么就可以输入命令"dir c:\*.txt"。
- ② 在set /a中的二元运算符,表示算术乘法。
- ③ 在findstr/r中表示将前一个字符多次匹配。
- -
- ① 范围表示符,比如日期的查找,for命令里的tokens操作中就可以用到这个字符。
- ② 在findstr/r中连接两个字符表示匹配范围。
- ③ -跟在某些命令的/后表示取反向的开关。
- ④ 在set /a中:
- 1.表示一个负数。
- 2.表示算术减运算。
- +
- ① 主要是在copy命令里面会用到它,表示将很多个文件合并为一个文件,就要用到这个+字符了。
- ② 在set/a中的二元运算符,表示算术加法。
- :
- ① 标签定位符,表示其后的字符串为以标签,可以作为goto命令的作用对象。比如在批处理文件里面定义了一个":begin"标签,用"goto begin"命令就可以转到":begin"标签后面来执行批处理命令了。
- ② 在%var:string1=string2%中分隔变量名和被替换字串关系。
- |
- ① 管道符,就是将上一个命令的输出,作为下一个命令的输入."dir /a/b |more"就可以逐屏的显示dir命令所输出的信息。
- ② 在set/a中的二元运算符,表示按位或。
- ③ 在帮助文档中表示其前后两个开关、选项或参数是二选一的。
- /
- ① 表示其后的字符(串)是命令的功能开关(选项)。比如"dir /s/b/a-d"表示"dir"命令指定的不同的参数。
- ② 在set/a中表示除法。
- >
- ① 命令重定向符,将其前面的命令的输出结果重新定向到其后面的设备中去,后面的设备中的内容被覆盖。比如可以用"dir > lxmxn.txt"将"dir"命令的结果输出到"lxmxn.txt"这个文本文件中去。
- ② 在findstr/r中表示匹配单词的右边界,需要配合转义字符\使用。
- <
- ① 将其后面的文件的内容作为其前面命令的输入。
- ② 在findstr/r中表示匹配单词的左边界,需要配合转义字符\使用。
- =
- ① 赋值符号,用于变量的赋值。比如"set a=windows"的意思意思是将"windows"这个字符串赋给变量"a"。
- ② 在set/a中表示算术运算,比如"set /a x=5-6*5"。
- \
- ① 这个"\"符号在有的情况下,代表的是当前路径的根目录.比如当前目录在c:\windows\system32下,那么你"dir \"的话,就相当与"dir c:\"。
- ② 在findstr/r中表示正则转义字符。
- ,
- ① 在set /a中表示连续表达式的分割符。
- ② 在某些命令中分割元素。
- .
- ① 在路径的\后紧跟或者单独出现时:
- 一个.表示当前目录。
- 两个.表示上一级目录。
- ② 在路径中的文件名中出现时:
- 最后的一个.表示主文件名与扩展文件名的分隔。
- ?
- ① 在findstr/r中表示在此位置匹配一个任意字符。
- ② 在路径中表示在此位置通配任意一个字符。
- ③ 紧跟在/后表示获取命令的帮助文档。
- ___________________________________________________
- 二、多符号(符号不能分隔)
- &&
- ① 连接两个命令,当&&前的命令成功时,才执行&&后的命令。
- ||
- ① 连接两个命令,当||前的命令失败时,才执行||后的命令。
- >&
- ① 将一个句柄的输出写入到另一个句柄的输入中。
- <&
- ① 从一个句柄读取输入并将其写入到另一个句柄输出中。
- %%
- ① 两个连续的%表示在预处理中脱为一个%。
- ② 批处理中,在for语句的in子句之前,连续两个%紧跟一个字符(可以是字母、数字和一些特定字符),表示指定一个循
- 环或者遍历指标变量。
- ③ 批处理中,在for语句中,使用与in之前指定的指标变量相同的串,表示引用这个指标变量。
- >>
- ① 命令重定向符,将其前面的命令的输出结果追加到其后面的设备中去。
- ② 在set /a中的二元运算符,表示逻辑右移。
- ==
- ① 在if命令中判断==两边的元素是否相同。
- <<
- ① 在set /a中的二元运算符,表示逻辑左移。
- +=
- ① 在set /a中的二元运算符。例如set /a a+=b表示将a加上b的结果赋值给a。
- -=
- ① 在set /a中的二元运算符。例如set /a a-=b表示将a减去b的结果赋值给a。
- *=
- ① 在set /a中的二元运算符。例如set /a a*=b表示将a乘以b的结果赋值给a。
- /=
- ① 在set /a中的二元运算符。例如set /a a/=b表示将a加上b的结果赋值给a。
- %=
- ① 在set /a中的二元运算符。例如set /a a%=b表示将a除以b的余数赋值给a。
- 【注:命令行可以直接用 set /a a%=b ,在批处理里面可以用 set /a a%%=b 。】
- ^=
- ① 在set /a中的二元运算符。例如set /a a"^="b表示将a与b按位异的结果赋值给a。
- 【注:这里 "^=" 加引号是为了防止^被转义,下同。】
- &=
- ① 在set /a中的二元运算符。例如set /a a"&="b表示将a与b按位与的结果赋值给a。
- |=
- ① 在set /a中的二元运算符。例如set /a a"|="b表示将a与b按位或的结果赋值给a。
- <<=
- ① 在set /a中的二元运算符。例如set /a a"<<="b表示将a按位左移b位的结果赋值给a。
- >>=
- ① 在set /a中的二元运算符。例如set /a a">>="b表示将a按位右移b位的结果赋值给a。
- \<
- ① 在findstr的一般表达式中表示字的开始处。
- \>
- ① 在findstr的一般表达式中表示字的结束处。
- ___________________________________________________
- 三、双符号对(两个符号之间须指定字符串)
- ! !
- ① 当启用变量延迟时,使用!!将变量名扩起来表示对变量值的引用。
- ' '
- ① 在for/f中表示将它们包含的内容当作命令行执行并分析其输出。
- ② 在for/f "usebackq"中表示将它们包含的字符串当作字符串分析。
- ( )
- ① 命令包含或者是具有优先权的界定符,比如for命令要用到这个(),我们还可以在if,echo等命令中见到它的身影。
- ② 在set /a中表示表达式分组。
- " "
- ① 界定符,在表示带有空格的路径时常要用""来将路径括起来,在一些命令里面也需要" "符号。
- ② 在for/f中将表示它们包含的内容当作字符串分析。
- ③ 在for/f "usebackq"表示它们包含的内容当作文件路径并分析其文件的内容。
- ④ 在其它情况下表示其中的内容是一个完整的字符串,其中的>、>>、<、&、|、空格等不再转义。
- ` `
- ① 在for/f中表示它们所包含的内容当作命令行执行并分析它的输出。
- % %
- ① 使用两个单独的%包含一个字符串表示引用以此串为名的环境变量。比如一个%time%可以扩展到当前的系统时间。
- [ ]
- ① 在帮助文档表示其中的开关、选项或参数是可选的。
- ② 在findstr /r中表示按其中指定的字符集匹配。
复制代码
- @echo off
- echo %%
- pause
- echo ^%
- pause
③ 转义符号:如果要显示%本身时,需要在前面用%来转义。
这是我目前看到的最头疼,还看不懂复制代码
- @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"
这个#感觉好像就是当作个普通字符 假设for循环过程中的%%a取得的变量这为abc,那么set #%%a=%%b就表示定义一个变量“#abc”复制代码
- for /f "usebackq tokens=1* delims=. " %%a in ("list.txt") do set #%%a=%%b
这个不应该看成是两个叹号,而是前后两个“!!”变量引用符,即!a:~0,11!和!a:~-1!,然后把两个字符串连接起来了,假设现在a变量表示字符串“0123456789abcdef”,那么!a:~0,11!表示的是字符串“0123456789ab”,!a:~-1!表示的是字符f,连接起来!a:~0,11!!a:~-1!表示的就是“0123456789abf”这么个字符串。复制代码
- "!a:~0,11!!a:~-1!"=="TITLE"Track""
这个应该和第一步定义set #%%a=%%b相关,这时候用到了,要不然开始你看第一个for循环好像没什么意义复制代码
- "%%b.!#%%b!"
个人感觉,转义要不要无所谓,但我知道for循环里出现管道命令|一定要用转义符复制代码
- for %%b in (!a:~-3^,2!)
欢迎光临 批处理之家 (http://www.bathome.net/) | Powered by Discuz! 7.2 |