Windows批处理脚本(.bat文件)语法笔记

前言

最近在批量重命名文件和使用ffmpeg进行视频格式转换时,经常使用到windows的批处理脚本,也就是.bat文件。但之前都是查到脚本代码就直接使用,对脚本的语法没有了解。正好今天有时间,就系统性的学习以下批处理脚本的语法。我感觉windows的批处理语法和Linux的shell脚本非常相似。同时既然是脚本语言,那和C++、Java等高级编程语言也有很多相似之处。

批处理脚本的使用方法

首先是批处理脚本的使用方法。一般是新建一个文本文档,然后将后缀名改为.bat。然后选中该文件,右键选择编辑,编写脚本代码。编码完成后双击文件运行。

一、 注释与输入、输出

按江湖规矩,学习一门编程语言,首先是使用输出语句输出“Hello World"。
批处理脚本语法中的标准输入、标准输出和标准错误输出分别使用0、1、2来表示,这三个数字在将输入输出结果重定向时会使用到。

注释

  1. # 在批处理脚本中,使用#表示注释当前行。
  2. @echo off 使用@echo off表示此后不显示执行的命令本身。也就是说,如果不加这个,你的脚本在执行时,代码中的命令也会出现在cmd窗口中。

输出

  1. 输出到cmd窗口(类似C中的print):
echo Hello World
  1. 重定向输出内容(一般是将输出内容写入文件):
覆盖使用操作符>,附加使用操作符>>
标准输出为 1>或1>> 标准错误输出为 2>或2>>
单独使用>>>默认为标准输出。
使用运算符>& 将标准输出和标准错误输出相互转换。如 1>&2 表示将标准输出当作标准错误输出使用。

使用示例:
编写一个脚本文件write.bat,内容如下:
@echo off
echo Hello World #输出Hello World
QQ.exe #运行当前路径下名为QQ的可执行文件

如果双击write.bat执行,则会在弹出的cmd窗口中显示:
Hello World
'QQ.exe' 不是内部或外部命令,也不是可运行的程序或批处理文件。

如果我希望将这个结果写入一个文本文档result.txt中,则需要打开cmd,跳转到write.bat所在路径,然后执行以下命令:
write.bat 1> result.txt

然后点击运行,运行后,打开result.txt查看内容:
Hello World

之所以没有第二行的错误提示,是因为 1> 只会重定向标准输出。
如果希望两行都写入文本,可以使用以下代码:
write.bat 1> result.txt 1>&2 #这里将标准错误输出转换为了标准输出。

输入

  1. 读取文件内容:
使用操作符 < 来读取文件内容
例如:
string < result.txt #将result.txt中的内容读入string中。
  1. 接收参数:
在cmd窗口中执行脚本时,将参数写在脚本名称的后面,用空格分开。
在脚本中通过%1, %2, %3.....%9来使用这些参数。

第十个以及以后的参数需要用到循环和shift命令来获取。使用shift命令从参数列表中弹出第一个参数,这使得所有的参数都向左移动,这样第十个参数就可以通过%9来获取了。

同时,这些参数在接收时也可以有选项。如:
%~I表示从第I个命令行参数中删除引号。
%~fI表示展开第I个命令行参数完整路径。
%~dpI表示第I个文件路径参数的完整父级路径。
%~nxI表示第I个文件路径参数的文件名(包括扩展名)。

例如:
编写一个名为getParameters.bat的脚本文件:
@echo off
echo %1, %2, %3 #将接收的三个参数打印出来

在cmd中执行这个脚本:
getParameters.bat p1 p2 p3

结果会在cmd中打印出 p1 p2 p3.
  1. 接收用户输入:
    有两种接收用户输入的方式,分别为使用choice,和set /p。下面分别用这两种方式来实现同一个程序。
使用choice:
@echo off
:yes
choice /c ny /m "Do you want to run the program again"
#/c指定了可选按键 /m在提示语句前表示输出”“中的那段文本。
if errorlevel 2 goto yes
#errorlevel 代表可选按键中的第二个,即y。
if errorlevel 1 goto no
:no

使用set /p:
@echo off
:yes
SET /P yes="Do you want to run this program again?[y/n]"
#首先输出yes中的内容,然后将用户输入赋值给yes
echo %yes% | findstr /i "y" > nul && GOTO yes
#利用管道将第一个命令的结果作为第二个命令的输入。
#findstr 表示查找输入内容是否有 y ,/i表示不区分大小写。
#nul表示不输出到显示器。

两个程序的运行结果是一样的。
其中两个程序中都用到了命令 : ,这个命令用于声明一个代码块,其内容是一直到下一个 : 为止。格式为 : 代码块名称 内容。
由第一个程序可以看出,声明了yes和no两个代码块,其中no代码块没有内容。
使用goto指令来跳转向某个代码块。
  1. 管道
批处理脚本中用管道将第一个命令的结果作为第二个命令的输入。用 | 表示。
例如:
命令一.bat | 命令二.bat

二、 变量

在Windows的批处理脚本中,变量是没有数据类型的,也不需要提前声明。
使用set指令对变量进行赋值。

例如 set a=1

set有以下几个属性:
/A 表示支持算数操作

默认情况下,变量对整个cmd会话是全局的。调用setlocal命令,将变量变为局部变量。

setlocal
set a=1
echo %1%

如果要输出某个变量值,则需要使用双引号。

set a=1
echo "a"

结果为 1

三、 if语句

这个与一般的编程语言没有什么区别。形式如下:

if 判断条件 (
代码块1
) else (
代码块2
) 

值得注意的是,else不允许直接是行首。同时要注意判断条件附近空格的使用。
判断条件分为以下四种。

  1. errorlevel值,这个在choice命令那里已经示范过。
  2. 比较判断,常用的如下:
	== 等于 
  EQU 等于 
  NEQ 不等于 
  LSS 小于 
  LEQ 小于或等于 
  GTR 大于 
  GEQ 大于或等于 
  1. 存在判断
if exists something(
echo "something exists"
)
这样的语法结构判断文件或者目录的存在。
  1. 定义判断
if [not] defined 变量(
} else ()

判断变量是否存在,即是否已被定义。

四、 循环

批处理脚本中,循环语句的结构如下:

for %%变量 in (某个范围) do 循环体

其中,在cmd窗口中直接输入时,变量前的%只需要打一个即可,需要注意。

这里的循环结构我认为和python中的遍历很像,即从一个集合中一个一个的取值、执行。
例如:
for %%i in (a,"b c",d) do echo %%i 

循环语句有多个属性(开关),最常使用的是 /l 和 /f。

  1. /l
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
通过这个参数可以实现
加上这参数后,循环结构就更像java或c++中常用的for循环了。
  1. /f
FOR /F ["options"] %%variable IN (set) DO command 
其中,set为string、command、file-set中的一个。
options是eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq中的一个或多个的组合。
说实话这个方式我也没理解,到时候需要用到了再去深入的了解吧。

五、 函数

其实批处理脚本中的函数在输入输出那一部分就使用过了,就是 : 定义的代码块。

函数定义

使用如下结构定义函数:
:函数名
函数体
goto:eof

注意 : ,以及结尾的goto:eof不要遗漏。

函数调用

直接使用call命令调用即可。形式如下:
call 函数名 参数1 参数2 .......

返回值

其实我们这里的函数并不是其他高级语言的那种函数,所以没有一个模式化的返货值。
一般通过全局变量或者参数进行返回。

六、 其他重要技巧

  1. 使用命令名 /?的方式,可以在cmd窗口中查询该命令的使用方法。
  2. 默认情况下,当脚本发生错误时还是会继续执行。需要我们自己在运行脚本是,来防止这种情况发生。
MyBat.exe || exit /b 1

||操作符表示跟随命令,在脚本错误后执行。
其中exit表示退出脚本,/b表示不退出当前窗口,1是返回码。
在cmd中0表示运行成功,非0表示运行失败。

结语

这里只是阐述了编写一个批处理脚本文件的大概框架,其实更重要的是window系统提供的那些命令,只有配合上各种命令才能编写完整的脚本程序。

参考资料

  1. Windows 批处理脚本指南
  2. windows bat批处理语法简析
  3. bat 脚本之 使用函数
  4. dos命令行choice命令使用详解

你可能感兴趣的:(Tips,window,cmd)