Skip to content

Win.bat

1 问题: 如果语句不完整,例如 set /p a rem 不写=会提示命令不正确 if "%a%"=="1" ( echo 1 ) else ( rem 不写右括号会直接退出 区别在于是dos语句?

echo off和 @echo off

2 命令简介 2.1 内置变量 %null%是空变量

2.2 字符串操作 2.2.1 截取字符串 echo %varname:~m,n% 截取从varname变量中第m个开始(包含)后的n个内容。

echo 截取前5个字符:   echo %ifo:~0,5%   echo 从第4个字符开始,截取5个字符:   echo %ifo:~3,5%   echo 从倒数第14个字符开始,截取5个字符: echo %ifo:~-14,5%

以下没用过,不知道对不对。   echo 截取最后5个字符:   echo %ifo:~-5%   echo 截取第一个到倒数第6个字符:   echo %ifo:~0,-5%

2.2.2 替换字符串 替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串。举例说明其功能: @echo off set aa=伟大的中国!我为你自豪! echo 替换前:%aa% echo 替换后:%aa:中国=中华人民共和国% echo aa = %aa% set "aa=%aa:中国=中华人民共和国%" echo aa = %aa% pause

2.2.3 findstr

2.2.3.1 1.findstr . 2.txt 或 Findstr "." 2.txt
从文件2.txt中查找任意字符,不包括空字符或空行

2.2.3.2 2.findstr .* 2.txt 或 findstr ".*" 2.txt 从文件2.txt中查找任意字符包括空行和空字符

2.2.3.3 3.findstr "[0-9]" 2.txt 从文件2.txt中查找包括数字0-9的字符串或行

2.2.3.4 4.findstr "[a-zA-Z]" 2.txt 从文件2.txt中查找包括任意字符的字符串或行

2.2.3.5 5.findstr "[abcezy]" 2.txt 从文件2.txt中查找包括a b c e z y字母的字符串或行

2.2.3.6 6.findstr "[a-fl-z]" 2.txt 从文件2.txt中查找小写字符a-f l-z的字符串,但不包含g h I j k这几个字母。

2.2.3.7 7.findstr "M[abc][hig]Y" 2.txt 从文件2.txt中可以匹配 MahY , MbiY, MahY等…..

2.2.3.8 8. ^和$符号的应用 ^ 表示行首,"^step"仅匹配 "step hello world"中的第一个单词 $ 表示行尾,"step$"仅匹配 "hello world step"中最后一个单词 ====================

2.2.3.9 9.findstr "[^0-9]" 2.txt 如果是纯数字的字符串或者行便过滤掉,例如2323423423 这样的字符串,如果是345hh888这样的形式就不成了。 ====================

2.2.3.10 10.findstr "[^a-z]" 2.txt 同上,如果是纯字母的字符串或者行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf这样的字符,如果是sdfksjdkf99999这样的形式,掺杂着数字就不成了 ====================

2.2.3.11 11.号的作用 前面已经说过了 "."表示搜索的条件是任意字符,*号在正则表达式中的作用不是任何字符,而是表示左侧字符或者表达式的重复次数,*号表示重复的次数为零次或者多次。 ====================

2.2.3.12 12.findstr "^[0-9]$" 2.txt 这个是匹配找到的纯数字,例如 234234234234,如果是2133234kkjl234就被过滤掉了。 Findstr "^[a-z]$" 2.txt 这个是匹配找到的纯字母,例如 sdfsdfsdfsdf,如果是213sldjfkljsdlk就被过滤掉了 如果在搜索条件里没有*号,也就是说不重复左侧的搜索条件,也就是[0-9] [a-z]那只能匹配字符串的第一个字符也只有这一个字符,因为有行首和行尾的限制,"^[0-9]$"第一个字符如果是数字就匹配,如果不是就过滤掉,如果字符串是 9 就匹配,如果是98或者9j之类的就不可以了。 =====================

2.2.3.13 13. "\<…>"这个表达式的作用 这个表示精确查找一个字符串,\<sss 表示字的开始位置,sss>表示字的结束位置 echo hello world computer|findstr "\<computer>"这样的形式 echo hello worldcomputer|findstr "\<computer>" 这样的形式就不成了,他要找的是 "computer"这个字符串,所以不可以。 echo hello worldcomputer|findstr ".*computer>"这样就可以匹配了

2.3 文件操作 2.3.1 注意事项: 文本文件的编码:如果文件编码是ANSI,是可以读取的,如果是UniCode就无法识别了。找了很久才发现原因 如果a.txt是unicode编码的,用for循环尝试读取其中的数据时会将a.txt作为字符而非文件名执行。即"a.txt",如下两个代码运行效果相同(a.txt是unicode编码) for %%l in (a.txt) do ( pause) 和for %%l in ("a.txt") do ( pause) 只会循环一次,%i="a.txt" 来源:https://blog.csdn.net/mfx1986/article/details/5606228 2.3.2 用for循环读取文件

for /f "skip=1 delims=" %%a in (1.txt) do ( set txt=%%~a goto :Show ) :Show echo %txt% pause

连用括号时,DO后面的空格不能省 缩进无所谓 用法: FOR %variable IN (set) DO command [command-parameters]

%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 command-parameters 为特定命令指定参数或命令行开关。

如果启用命令扩展,则会支持下列 FOR 命令的其他格式: FOR /D %variable IN (set) DO command [command-parameters] 如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。 FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

1
2
3
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

1
2
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %variable IN ("string") DO command [command-parameters] FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

1
或者,如果有 usebackq 选项:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %variable IN ("string") DO command [command-parameters] FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,
每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,
然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。
以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
你可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个
或多个指定不同解析选项的关键字。这些关键字为:

    eol=c           - 指一个行注释字符的结尾(就一个)
    skip=n          - 指在文件开始时忽略的行数。
    delims=xxx      - 指分隔符集。这个替换了空格和制表符的
                      默认分隔符集。
    tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                      的 for 本身。这会导致额外变量名称的分配。m-n
                      格式为一个范围。通过 nth 符号指定 mth。如果
                      符号字符串中的最后一个字符星号,
                      那么额外的变量将在最后一个符号解析之后
                      分配并接受行的保留文本。
    usebackq        - 指定新语法已在下类情况中使用:
                      在作为命令执行一个后引号的字符串并且一个单
                      引号字符为文字字符串命令并允许在 file-set
                      中使用双引号扩起文件名称。

某些范例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
会分析 myfile.txt 中的每一行忽略以分号打头的那些行
每行中的第二个和第三个符号传递给 for 函数体用逗号和/
空格分隔符号请注意 for 函数体的语句引用 %i 
获得第二个符号引用 %j 来获得第三个符号引用 %k
来获得第三个符号后的所有剩余符号对于带有空格的文件
你需要用双引号将文件名括起来为了用这种方式来使
用双引号还需要使用 usebackq 选项否则双引号会
被理解成是用作定义某个要分析的字符串的

%i  for 语句中显式声明%j  %k 是通过
tokens= 选项隐式声明的可以通过 tokens= 一行
指定最多 26 个符号只要不试图声明一个高于字母 "z" 
"Z" 的变量请记住FOR 变量是单一字母分大小写和全局的变量
而且不能同时使用超过 52 

还可以在相邻字符串上使用 FOR /F 分析逻辑方法是
用单引号将括号之间的 file-set 括起来这样该字符
串会被当作一个文件中的一个单一输入行进行解析

最后可以用 FOR /F 命令来分析命令的输出方法是
括号之间的 file-set 变成一个反括字符串该字符串会
被当作命令行传递到一个子 CMD.EXE其输出会被捕获到
内存中并被当作文件分析如以下例子所示:

  FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

会枚举当前环境中的环境变量名称

另外,FOR 变量参照的替换已被增强。你现在可以使用下列 选项语法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 %~I          - 删除任何引号("),扩展 %I
 %~fI        - 将 %I 扩展到一个完全合格的路径名
 %~dI        - 仅将 %I 扩展到一个驱动器号
 %~pI        - 仅将 %I 扩展到一个路径
 %~nI        - 仅将 %I 扩展到一个文件名
 %~xI        - 仅将 %I 扩展到一个文件扩展名
 %~sI        - 扩展的路径只含有短名
 %~aI        - 将 %I 扩展到文件的文件属性
 %~tI        - 将 %I 扩展到文件的日期/时间
 %~zI        - 将 %I 扩展到文件的大小
 %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
               到找到的第一个完全合格的名称。如果环境变量名
               未被定义,或者没有找到文件,此组合键会扩展到
               空字符串

可以组合修饰符来得到多重结果:

1
2
3
4
5
6
 %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
 %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
 %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
 %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
               到找到的第一个驱动器号和路径。
 %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法 用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名 比较易读,而且避免与不分大小写的组合键混淆。

2.3.2.1 tokens tokens=有时表示提取全部。 tokens=m表示提取第m列。使用一个输出变量。%%a tokens=m,n表示提取第m列和第n列。使用两个输出变量。 tokens=m-n表示提取第m列至第n列。使用多个输出变量。 Tokens=(表示删除每行前面的空格。忽略行首的所有空格。——存疑)表示提取所有列。 tokens=m提取第m列及以后的所有字符,星号表示剩余的字符。使用两个输出变量。 tokens=m,*提取第m列以后的所有字符,星号表示剩余的字符。使用两个输出变量。 在 FOR 语句中显式声明变量 %%I。

2.3.2.2 delims定义分隔符: delims=,./ 表示用逗号 点号 和斜杆作为分隔符。 注意上面这里[delims=, ]后有空格,也就是说逗号和空格作为分隔符。

for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a 对 dir 命令的结果,跳过前面 5 行,余下的每行取第 4 列 每列之间的分隔符为默认的 "空格"

2.4 IF命令 2.4.1 判断变量值是否为空 用 if defined str 语句来判断变量值是否为空。 只能判断set str="",不能判断 set str= if "%two%"=="" (echo null) else echo %2 注意:变量在引用时要用双引号括起来。

2.4.2 注意事项 if*)else()中 )和else要在一行。(为什么?) if 判断命令 if "%1"=="/a" echo 第一个参数是 /a if /i "%1" equ "/a" echo 第一个参数是 /a 2.5 指令注意事项:大小写均可

echo [{on|off}] [message] pause call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。语法 call [路径文件名] [标签]] start 2.6 常用参数: MIN 开始时窗口最小化 SEPARATE 在分开的空间内开始 16 位 Windows 程序 HIGH 在 HIGH 优先级类别开始应用程序 REALTIME 在 REALTIME 优先级类别开始应用程序 WAIT 启动应用程序并等候它结束 parameters 这些为传送到命令/程序的参数

2.7 GOTO 命令 跳转命令。 程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序。 语法:goto label (label是参数,指定所要转向的批处理程序中的行。) 重定向1 >;与>> 重定向2 \< set /p var=\<a.txt 管道符号 | 将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入。使用格式为:command_1|command_2

2.7.1 转义符 ^

2.7.2 逻辑命令符 &-它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败; &&-当&&;前面的命令成功执行时,执行&&;后面的命令,否则不执行; ||-当||前面的命令失败时,执行||后面的命令,否则不执行。

======================================================= 脚本语言又被称为扩建的语言,或者动态语言,是一种编程语言,用来控制软件应用程序,脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。缩短传统的“编写-编译-链接-运行”过程而创建的计算机编程语言

======================================================= 2.7.3 if 语法

批处理命令中if后面是能够跟else的。 if 语句的格式是(command是满足条件时要执行的命令): IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command NOT 指定只有条件为 false 的情况下,Windows 才 应该执行该命令。 ERRORLEVEL number 如果最后运行的程序返回一个等于或大于 指定数字的退出代码,指定条件为 true。 string1==string2 如果指定的文字字符串匹配,指定条件为 true。 EXIST filename 如果指定的文件名存在,指定条件为 true。 command 如果符合条件,指定要执行的命令。如果指定的 条件为 FALSE,命令后可跟 ELSE 命令,该命令将 在 ELSE 关键字之后执行该命令。 ELSE 子句必须出现在同一行上的 IF 之后。----请特别注意这一部分: 例如: IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. ) 由于 del 命令需要用新的一行终止,因此以下子句不会有效: IF EXIST filename. del filename. ELSE echo filename. missing 由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也 不会有效: IF EXIST filename. del filename. ELSE echo filename. missing 如果都放在同一行上,以下子句有效: IF EXIST filename. (del filename.) ELSE echo filename. missing 如果命令扩展被启用,IF 会如下改变: IF [/I] string1 compare-op string2 command IF CMDEXTVERSION number command IF DEFINED variable command 其中, compare-op 可以是: EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 而 /I 开关(如果指定)说明要进行的字符串比较不分大小写。 /I 开关可以用于 IF 的 string1==string2 的形式上。这些 比较都是通用的;原因是,如果 string1 和 string2 都是 由数字组成的,字符串会被转换成数字,进行数字比较。 CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它 是在跟与命令扩展有关联的内部版本号比较。第一个版本 是 1。每次对命令扩展有相当大的增强时,版本号会增加一个。 命令扩展被停用时,CMDEXTVERSION 条件不是真的。 如果已定义环境变量,DEFINED 条件的作用跟 EXIST 的一样, 除了它取得一个环境变量,返回的结果是 true。 如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL% 会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,您会得到 其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法: goto answer%ERRORLEVEL% :answer0 echo Program had return code 0 :answer1 echo Program had return code 1 您也可以使用以上的数字比较: IF %ERRORLEVEL% LEQ 1 goto okay 如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE% 将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始 命令行;否则,您会得到其数值。 如果没有名为 CMDEXTVERSION 的环境变量, %CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的 字串符表达式;否则,您会得到其数值。

======================================================== 2.7.4 赋值和输入 SET /A expression 变量赋值 SET /P variable=[promptString] 等待用户输入的变量赋值

========================================================= 2.7.5 数学运算符

() - 分组 ! ~ - - 一元运算符

  • / % - 算数运算符
      • 算数运算符 \<\< >> - 逻辑移位 & - 按位“与” ^ - 按位“异” | - 按位“或” = = /= %= += -= - 赋值 &= ^= |= \<\<= >>= &且 ^或 \<\<左移(二进制,相当于2) >>右移(二进制,相当于/2) %取余 作为运算符要加双引号

set /a c= c "\<\<" 2

============================================================================== 2.7.6 dos命令的输出方

我们平时敲命令,默认定向是控制台。例如dir命令,其实实际运行了“dir >con”#

“>nul”把执行结果定向到空,不返回任何结果 文件列表到文件,就可以把重定向转到文件,可以“dir >list.txt” “dir >>list.txt”把dir到的结果追加到文件 devcon find *>1.txt 输出到1.txt

2.7.7 格式图例 格式 意义 斜体

用户必须提供的信息

粗体

用户必须像显示的一样准确键入的元素

省略号 (...)

可在命令行中重复多次的参数

在方括号 ([]) 之间

可选项目

在大括号 ({}) 之间;将选项用管线 (|) 隔开。示例:{even|odd}

用户必须从中只选择一个选项的选项组

Courier font

代码或程序输出

3 函数 3.1 批量重命名 dir /b>rename.xls ="ren "&$A1&" "&$B1