windows bat 批处理脚本编写指南

1、也来个“Hello World”

我们学java、python等高级语言,恐怕第一个DEMO都是输出“Hello World”字符串,学习bat批处理脚本,不妨也来个“Hello World”。

1) helloworld.bat

打开cmd命令窗口,切换到D:cmdtest目录,运行helloworld 或 helloworld.bat

2) 代码简要说明
  • @echo off,关闭之后所有命令的回显,不然bat文件中每条指令会在cmd命令窗口显示
  • rem,注释,还有::也表示注释,两者区别,大家请小度
  • echo,输出
  • echo=,输出空白行
3) 工具说明

为了提高bat批处理脚本开发、测试效率,建议:

  • 安装powercmd替代原cmd
  • 使用vscode,有良好的语法、关键字提示,并且自带terminal即cmd窗口

2、变量

1)变量声明

变量无需声明可直接引用,其值为空字符串,并且大小写不敏感。可使用defined关键字或是否为空字符串””判断变量是否为空,如下所示:

说明:

  • 第一次会输出两遍var2 is not defined, the value is:
  • 先给变量赋值 set var2=“var2”,则会输出两遍 var2 is defined, the value is: “var2”
  • 如果变量set var2=”var2″赋值过,然后将赋值set var2=”var2″语句注释掉并运行,依然会输出 var2 is defined, the value is: “var2”,这是因为bat脚本变量不特殊处理的话是全局变量,只要脚本是在同一个cmd命令框运行便会存在,可通过 set var2= 清除
2)变量赋值

说明:

  • 变量赋值时等 前后不能有空格,类似set a = 1会 错
  • /a 是表达式运算,仅适合32位整型运算,可以是负数
  • /p 是提示输入,将输入值赋值给变量
  • set /p md5=
  • 可通过set a=清空变量
3)变量读取
  • 可通过%var%, 读取变量值
  • set var,列出var开头的所有变量
  • set,列出所有变量,如系统环境变量TEMP、PATH等也会列举出来
  • 需要了解的一些系统内置变量
    • %date%,系统日期,类似:2020/02/29 周六
    • %time%,获取系统时间,类似:17:13:15.18
    • %cd%,获取当前目录
    • %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字
    • %NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
    • %PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于Itanium
    • %PROCESSOR_IDENTFIER% 系统 返回处理器说明。
    • %PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型 。
    • %PROCESSOR_REVISION% 系统 返回处理器的版本 。
    • %COMPUTERNAME% 系统 返回计算机的名称。
    • %USERNAME% 本地 返回当前登录的用户的名称。
    • %USERPROFILE% 本地 返回当前用户的配置文件的位置。
4)变量作用域

默认为全局变量(Global),可使用setlocal命令将变量作用域设置为local,直到endlocal或exit命令,或bat文件执行结束,变量local作用域也结束并恢复到global作用域,看下述DEMO。
var_scope.bat

cmd命令框

读者朋友们可以尝试将var_scope.bat文件中的setlocal命令注释掉,然后执行上述cmd命令框中的代码,我们将发现变量v最终输出的是“Local Variable”,即外面设置的变量v被bat文件中的变量v玷污了。

5)变量延迟

var_normal.bat

var_normal.bat运行后将输出1,而不是2,原因如下:

当我们准备执行一条命令的时候,命令解释器会先将命令读取,如果命令中有环境变量,那么就会将变量的值先读取来出,然后在运行这条命令,如:echo %a%,当我们执行这条命令的时候,命令解释器会先读出%a%的值,即1,然后执行echo,所以输出1。

然而,上述脚本本意是输出a+=1运算后的a值,即2。bat脚本提供了变量延迟,即变量在使用时再读取,上述代码修改如下:
var_delay.bat

var_delay.bat 运行后会输出2,有2个注意事项:

  • setlocal EnableDelayedExpansion 开启变量延迟,无需关注变量延迟如何关闭,有时为了代码简洁也写成:@echo off & setlocal EnableDelayedExpansion
  • !a!,两个叹 ,变量才会延迟读取
6)特殊变量

说明:

  • %*,表示参数列表,比如:var_arg.bat arg1 arg2 arg3,则 %* = arg1 arg2 arg3
  • %1,表示第一个参数
  • %~1,第一个参数去引 ,如:var_arg.bat “arg1”,%~1得到arg1

3、返回码和errorlevel

1)返回码

通常来说一条命令的执行结果返回的值只有两个,0 表示”成功”,1 表示”失败”,实际上,errorlevel 返回值可以是一个任何整型值,一般只定义在0~255之间。

2)errorlevel如何使用

通常来说,可以根据errorlevel是否等于0来判断脚本是否成功执行(0表示成功,>0值表示失败),若明确脚本返回码的情况下,也可以根据具体返回码值做具体处理,DEMO如下:假设执行脚本后,errorlevel=0,则

说明:

  • errorlevel 1,errorlevel >= 1
  • %errorlevel% EQU 0,errorlevel == 0

4、stdin, stdout, stderr

stdin:标准输入,重定向时也用数字0表示
stdout:标准输出,重定向时也用数字1表示
stderr:错误输出,重定向时也用数字2表示

1)重定向

标准输出重定向

错误输出重定向

标准、错误输出合并
通常我们会将标准输出和错误输出合并到一个文件,如下所示:

说明:遍历SomeFile.txt,先将遍历结果输出到output.txt,如果出错则将错误信息添加到
output.txt(此处的“找不到文件”)。

标准输入
将某个文件作为内容输入,用

将countries.txt文件中的内容进行排序显示。

2)输出挂起、丢弃

用NUL表示丢弃任何程序输出,2个经典应用:

  • 字符串查找,findstrex.bat
  • 程序暂停若干秒

先输出”program sleep 5 seconds, start…”,5秒后再输出”program sleep 5 seconds, end…”

3)管道符 | 使用

管道符 | 通常用于一个命令的输出作为另一个命令的输入,如:

DIR /B,/B 使用空格式(没有标题信息或摘要)。
DIR /B | SORT,将dir /b结果进行字符串排序

5、if判断与&、&&、||

顺序、选择和循环是编程语言的常见3种语句,bat脚本也是如此,bat脚本if选择语句语法如下:

注意:

  • 条件只能是单个条件,不能用and或or进行条件与或运算,但是可以使用not 进行条件非运算
  • 没有elseif

条件判断比较常见应用场景如下:

1)文件是否存在,isexist.bat
2)变量是否定义
3)比较字符串是否相等,str.bat
@echo off & setlocalset /p arg1="please input a string:"set /p arg2="please input another string:"if %arg1%==%arg2% (echo %arg1% equals %arg2%) else (echo %arg1% not equals %arg2%)if not %arg1%==%arg2% (echo %arg1% not equals %arg2%) else (echo %arg1% equals %arg2%)

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月1日
下一篇 2020年1月1日

相关推荐