计算机技术基础 (bat 批处理)Note4
本节主要讲解一些 bat 批处理文件中的一些特殊符号,包括 @
, %
, >
和 >>
, |
, ^
, &
和 &&
和 ||
, " "
, ,
, ;
, ()
。
回显屏蔽符 @
回显屏蔽符 @
: 这个字符在批处理中的意思是关闭当前行的回显。
ECHO OFF
可以关闭掉整个批处理命令的回显,但不能关掉 ECHO OFF
这个命令的本身回显,我们常常在 ECHO OF
F 这个命令前加 @
就可以起到所有命令均不回显的作用。详细在 Note1 中有介绍,这里不多举例了。
变量引导符 %
变量引导符 %
:这个 %
严格来说算不上命令,它只是批处理中的参数而已(多个 %
一起使用的情况除外,以后会详细介绍)。
引用变量用 %var%
(var 代表变量名),调用程序外部参数用 %1
至 %9
等等
%0
%1
%2
%3
%4
%5
%6
%7
%8
%9
%*
为命令行传递给批处理的参数
%0
批处理文件本身,包括完整的路径和拓展名
%1
第一个参数
%9
第九个参数
%*
从第一个参数开始的所有参数
参数 %0
具有特殊功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
举例:
@echo off
set var1=123
echo %var1%
pause
结果:
C:\Users\rwq119\Desktop\test>exercise1.bat
123
Press any key to continue . . .
重定向符 >
和 >>
重定向符 >
:输出重定向命令,这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围。
重定向符 >>
:这个符号的作用和 >
(大于号)有点类似,但他们的区别是 >>
是传递并在文件的末尾追加内容,而 >
是覆盖。
示例:
@echo off
echo 1
echo 2 > res.txt
echo 3
运行后生成文件 res.txt :
我们再运行一遍,效果一样还是生成一个 res.txt,里面只有 2。这是因为再运行 echo 2 > res.txt
的时候,原来的 res.txt 被覆盖了,重新生成一个新的文件。
如果用 >>
@echo off
echo 1 > res.txt
echo 2 >> res.txt
echo 3 >> res.txt
echo 1 > res.txt
会先生成一个 res.txt,并往里打印1。后面的 >>
会向这个文件追加打印 2,3,不会覆盖原来的文件。
命令管道符 |
格式:第一条命令 | 第二条命令 [| 第三条命令...]
意思是将第一条命令的结果作为第二条命令的参数来使用。
比如: dir C:\| find “txt”
以上命令是,查找 C:\ 所有,并发现 TXT 的 文本文档。
转义字符 ^
转移符 ^
是对特殊符号 >
, <
, &
的前导字符,在命令中他将以上三个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如:
echo 1234 ^>1234.txt
结果直接打印
echo 1234 ^>1234.txt
另外,转义字符还可以用作续航符号,比如:
@echo off
echo 1^
2^
3^
4^
5
pause
结果:
12345
Press any key to continue . . .
组合命令 &
,&&
,||
组合命令 &
,&&
,||
为组合命令,顾名思义,就是可以把多个命令组合起来当成一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。
(1)&
(AND) 这个符号允许一行中使用两个以上的不同命令,当第一个命令执行失败了,也不影响后面的命令执行。这里 &
两边的命令是顺序执行的,从前往后执行。
语法:第一条命令 & 第二条命令 [& 第三条命令 ...]
示例:
dir Z:\ & dir y:\ & dir C:\
此命令会连续显示 z,y,c 盘符的内容,不理会该盘是否存在
C:\Users\rwq119>dir Z:\ & dir y:\ & dir C:\
The system cannot find the path specified.
The system cannot find the path specified.
Volume in drive C is Windows
Volume Serial Number is AA04-7A06
Directory of C:\
02/21/2023 12:43 PM <DIR> nm75g64
12/07/2019 11:14 AM <DIR> PerfLogs
06/13/2024 10:29 AM <DIR> Program Files
07/18/2024 10:40 AM <DIR> Program Files (x86)
08/25/2023 05:18 PM <DIR> RBuildTools
02/20/2023 05:52 PM <DIR> rtools42
02/08/2023 01:27 PM <DIR> SMSTSLog
04/03/2024 05:09 PM <DIR> Temp
02/20/2023 11:29 AM <DIR> Users
07/10/2024 10:35 AM <DIR> Windows
0 File(s) 0 bytes
10 Dir(s) 37,157,269,504 bytes free
(2)&&
用这个符号可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令。
示例:
dir Z:\ && dir y:\ && dir C:\
这里第一条命令执行失败,后面的命令也不会执行
C:\Users\rwq119>dir Z:\ && dir y:\ && dir C:\
The system cannot find the path specified.
(3)||
(注意是两个 |
, 与管道符号 |
区别) 组合命令 或 ,用这个可以执行多条命令,当第一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令
语法:第一条命令 || 第二条命令 [ || 第三条命令 ...]
dir Z:\ || dir C:\ || dir C:\ || dir y:\
结果:
C:\Users\rwq119>dir Z:\ || dir C:\ || dir C:\ || dir y:\
The system cannot find the path specified.
Volume in drive C is Windows
Volume Serial Number is AA04-7A06
Directory of C:\
02/21/2023 12:43 PM <DIR> nm75g64
12/07/2019 11:14 AM <DIR> PerfLogs
06/13/2024 10:29 AM <DIR> Program Files
07/18/2024 10:40 AM <DIR> Program Files (x86)
08/25/2023 05:18 PM <DIR> RBuildTools
02/20/2023 05:52 PM <DIR> rtools42
02/08/2023 01:27 PM <DIR> SMSTSLog
04/03/2024 05:09 PM <DIR> Temp
02/20/2023 11:29 AM <DIR> Users
07/10/2024 10:35 AM <DIR> Windows
0 File(s) 0 bytes
10 Dir(s) 37,158,957,056 bytes free
C:\Users\rwq119>
补充:如何判定命令是否失败了?
不是靠自己的主观判断和输出提示来判断的,而是去检测 ErrorLevel这个变量的值 如果是 0 表示成功,非0 表示失败。
可以 用 echo %ERRORLEVEL% 来查看 上一条命令是否执行失败 (可以多次查询,echo 命令不会重置 ErrorLevel 的值)
示例:
C:\Users\rwq119>dir C:\
Volume in drive C is Windows
Volume Serial Number is AA04-7A06
Directory of C:\
02/21/2023 12:43 PM <DIR> nm75g64
12/07/2019 11:14 AM <DIR> PerfLogs
06/13/2024 10:29 AM <DIR> Program Files
07/18/2024 10:40 AM <DIR> Program Files (x86)
08/25/2023 05:18 PM <DIR> RBuildTools
02/20/2023 05:52 PM <DIR> rtools42
02/08/2023 01:27 PM <DIR> SMSTSLog
04/03/2024 05:09 PM <DIR> Temp
02/20/2023 11:29 AM <DIR> Users
07/10/2024 10:35 AM <DIR> Windows
0 File(s) 0 bytes
10 Dir(s) 37,154,279,424 bytes free
C:\Users\rwq119>echo %ERRORLEVEL%
0
C:\Users\rwq119>echo %ERRORLEVEL%
0
C:\Users\rwq119>dir c
Volume in drive C is Windows
Volume Serial Number is AA04-7A06
Directory of C:\Users\rwq119
File Not Found
C:\Users\rwq119>echo %ERRORLEVEL%
1
C:\Users\rwq119>echo %ERRORLEVEL%
1
命令优先级
注意:组合命令和重定向命令一起使用的时候要注意优先级
管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令
等级高 |
【管道符】
等级中 >
【重定向符】
等级低 &
【组合命令】
(批处理在执行命令时,优先处理等级高的特殊符号)
字符串界定符 " "
双引号 " "
(注意单引号不行),允许在字符串中包含空格。
比如进入一个特殊目录可以用如下方法:
cd "program files"
cd progra~1
cd pro*
以上三种方法都可以进入 program files
这个目录
其他使用 " "
例子:
dir "program files"
逗号命令 ,
逗号 ,
,相当于空格,在某种情况下可以当做空格来使用
示例:
dir,C:\
结果 (和 dir C:\
一样):
C:\Users\rwq119>dir,C:\
Volume in drive C is Windows
Volume Serial Number is AA04-7A06
Directory of C:\
02/21/2023 12:43 PM <DIR> nm75g64
12/07/2019 11:14 AM <DIR> PerfLogs
06/13/2024 10:29 AM <DIR> Program Files
07/18/2024 10:40 AM <DIR> Program Files (x86)
08/25/2023 05:18 PM <DIR> RBuildTools
02/20/2023 05:52 PM <DIR> rtools42
02/08/2023 01:27 PM <DIR> SMSTSLog
04/03/2024 05:09 PM <DIR> Temp
02/20/2023 11:29 AM <DIR> Users
07/10/2024 10:35 AM <DIR> Windows
0 File(s) 0 bytes
10 Dir(s) 37,178,507,264 bytes free
分号命令 ;
推荐直接使用
空格
当命令相同时,可以将不同目录用来隔离开来,但执行效果不变,如果执行过程中发生错误,则只返回错误报告,但程序仍会执行。
事实上, ;
对批处理来说只是用来分隔的符号,把 ;
替换成空格
也可以达到这种效果,并且更规范
比如,有一个 bat 文件代码如下:
dir c:\;d:\;e:\;z:\
echo bat is continue
pause
结果:
C:\Users\rwq119\Desktop\test>dir c:\;d:\;e:\;z:\
The system cannot find the path specified.
C:\Users\rwq119\Desktop\test>echo bat is continue
bat is continue
C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .
第一行的 dir c:\;d:\;e:\;z:\
此命令相当于 同时要做
dir c:\
dir d:\
dir e:\
dir z:\
但是我们电脑没有 d,e,z 盘,dir c:\;d:\;e:\;z:\
会执行失败,返回错误报告,但是后面 echo bat is continue
依然执行。
事实上,
所能达到的效果是一样的 (更推荐)
有一个,bat 文件如下
dir c:\ d:\ e:\ z:\
echo bat is continue
pause
执行结果一样:
C:\Users\rwq119\Desktop\test>dir c:\ d:\ e:\ z:\
The system cannot find the path specified.
C:\Users\rwq119\Desktop\test>echo bat is continue
bat is continue
C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .
逗号也一样 ,
C:\Users\rwq119\Desktop\test>dir c:\,d:\,e:\,z:\
The system cannot find the path specified.
C:\Users\rwq119\Desktop\test>echo bat is continue
bat is continue
C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .
括号命令 ()
小括号 ()
在批处理编程中有特殊作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。
括号在 for
语句和 if
语句中常见,用来嵌套使用循环或条件语句,其实括号 ()
也可以单独使用。
比如,下面两种的写法效果一样,两种写法都被视为是一条命令行:
echo 1 & echo 2 & echo 3
也可以写成:
(
echo 1
echo 2
echo 3
)
这后面的 ()
需要在批处理文件中使用,或者在 cmd 中一行一行的输入。(在 cmd 中使用 (
他会问你 是否要输入更多命令 More?
直到你输入另一个 )
为止)。无论是bat文件还是cmd中,不能打成一行否则效果不对(后面的内容会被 echo
打印出),错误示范如下:
C:\Users\rwq119>(echo 1 echo 2 echo 3)
1 echo 2 echo 3
备注:
这个是自学 b 站up主 程序员血月做的笔记。原视频链接:
https://space.bilibili.com/327484473/channel/seriesdetail?sid=2069394
因本人水平有限,如有任何问题,欢迎大家批评指正!