计算机技术基础 (bat 批处理)Note3
本节主要讲 Goto
; Find
; TYPE
; START
; CALL
命令
Goto
命令
Goto
命令:指定跳转到标签行,找到标签行后,程序将处理下一行开始的命令。(它本身不执行任何操作,只是作为跳转的目标。)
标签的名字可以随便起(对大小写不敏感),但是最好是有意义的,字母前必须加个冒号 :
来表示这个字母是标签。
**注意这里:**标签只是给代码打一个标签,可以用来标记子程序。加上标签,只要没被跳过,不影响代码执行。**不像编程语言的函数那样,会将这一段代码封装只要不调用就不会运行。**可以仔细看下文 Goto
的第二个例子(结合if的列子)以及 call
的示例2,进一步理解。
Goto
命令就是根据这个冒号来寻找下一步跳到那一行命令。
示例:
@echo off
echo This is the start.
goto mylabel
echo This line will never be executed.
:mylabel
echo This is the label.
pause
在上面的例子中,脚本会打印“This is the start.”,然后跳转到标签mylabel处,打印“This is the label.”。位于goto和标签之间的代码行不会被执行。
结果:
This is the start.
This is the label.
Press any key to continue . . .
Goto
命令 也可以与条件语句结合使用,以实现条件跳转。示例2:
@echo off
set /p userInput="Enter your name: "
if "%userInput%"=="John" goto johnLabel
echo Hello, %userInput%!
echo print this texts
goto end
:johnLabel
echo Hello, John! Special message for you.
:end
echo Script ends.
pause
如果输入的是 John:
Enter your name: John
Hello, John! Special message for you.
Script ends.
Press any key to continue . . .
此时 if "%userInput%"=="John"
判断为真 运行 goto johnLabel
,将直接跳转到 标签为 :johnLabel
的地方 运行 echo Hello, John! Special message for you.
和后面的 :end
标签为 的代码(echo Script ends.
,pause
)。此时 echo Hello, %userInput%!
,echo print this texts
,goto end
将会被跳过。
如果输入的不是 John:
Enter your name: Yang
Hello, Yang!
print this texts
Script ends.
Press any key to continue . . .
此时 if "%userInput%"=="John"
判断为假,将不会运行 goto johnLabel
。此刻不会跳转,接着运行 echo Hello, %userInput%!
,echo print this texts
,goto end
。运行到 goto end
的时候,发生跳转,跳转到标签为 :end
的地方运行 echo Script ends.
,pause
。此时标签为 :johnLabel
的代码 echo Hello, John! Special message for you.
会被跳过。
所以我理解 goto
的类似于跳转,这个过程跳过一部分代码,但不影响后面的代码执行(加上标签,只要没被跳过,不影响代码执行。不要理解成类似于一些编程语言的函数那样只要不调用就不会运行。)。是否输入 John 最后一句都是 Script ends.
,但是不输入 John 得到的 Script ends.
,是通过 goto end
跳转的,而输入 John 不会运行 goto end
这一句。我这里加了一句 echo print this texts
更好理解。
Find
命令
Find
命令作用:在文件中搜索字符串。
字符串 (String):是由数字,字母,下划线组成的一串字符。
示例:
比如我们有一个文件 test.txt :
a1b2c3
a1b2c
3
aovndgobofnklndfa1b2c3dvsbsvdsf
我们写一个 bat 文件
@echo off
find "a1b2c3" test.txt
pause
find "a" test.txt
pause
find "a100b" test.txt
pause
输出结果:
C:\Users\rwq119\Desktop\test>exercise1.bat
---------- TEST.TXT
a1b2c3
aovndgobofnklndfa1b2c3dvsbsvdsf
Press any key to continue . . .
第一次找 “a1b2c3”, 这个在第一行是,第三行中间有 “a1b2c3” 这一部分。这些都被找出来了。注意第三个,我们虽然寻找 “a1b2c3”,但是模糊匹配第三行字符含有这个内容,这一行字符都会被打出来(这适用于我们想找一些相关词,但是记不住全部的字符的时候)。
我们继续执行:
C:\Users\rwq119\Desktop\test>exercise1.bat
---------- TEST.TXT
a1b2c3
aovndgobofnklndfa1b2c3dvsbsvdsf
Press any key to continue . . .
---------- TEST.TXT
a1b2c3
a1b2c
aovndgobofnklndfa1b2c3dvsbsvdsf
Press any key to continue . . .
这次我们找 “a”,这次含 “a” 的字符串都会被打印出来。
我们继续执行:
C:\Users\rwq119\Desktop\test>exercise1.bat
---------- TEST.TXT
a1b2c3
aovndgobofnklndfa1b2c3dvsbsvdsf
Press any key to continue . . .
---------- TEST.TXT
a1b2c3
a1b2c
aovndgobofnklndfa1b2c3dvsbsvdsf
Press any key to continue . . .
---------- TEST.TXT
Press any key to continue . . .
C:\Users\rwq119\Desktop\test>
这次我们找 “a100b”,因为不含有这个字符串,所以就没有打印任何出来。
注意:字符串需要加引号,否则报错。错误示范:
C:\Users\rwq119\Desktop\test>find a1b2c3 test.txt
FIND: Parameter format not correct
Type
命令
Type
命令 用以获取文件内容
示例:(依然用上文的 test.txt 文件)
type test.txt
pause
结果:
C:\Users\rwq119\Desktop\test>type test.txt
a1b2c3
a1b2c
3
aovndgobofnklndfa1b2c3dvsbsvdsf
C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .
START
命令
START
命令 用来启动应用程序,如:
notepad —— 打开记事本;calc —— 启动计算机
示例:
START calc
pause
START notepad
pause
运行 bat 文件以后:
计算机被打开,在点击任意键后,记事本被打开。
我个人尝试了一下不写 START
发现也可以运行。不知道两者区别是什么。有知道的大佬可以评论区讨论一下。
calc
pause
notepad
pause
CALL
命令
CALL
命令 调用程序,也可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理。
具体用法:
(1)示例1:和 start
一样可以调用程序
REM 下面这句会打开当前目录下的 test.txt 文档(保证当前目录下有这个文档)
call test.txt
pause
call calc
pause
call notepad
pause
(2)示例2: call
不单单可以和 start
一样启动应用程序,还可以调用批处理中的标签行(自己定义的子程序)。
@ echo off
echo 1
call :inter
echo 3
: inter
echo 2
结果:
C:\Users\rwq119\Desktop\test>exercise1.bat
1
2
3
2
我们发现 :inter
的子程序被提前调用了一遍,但是和 goto
语句不同,call
后面的语句还是会继续执行。call
执行完了以后,再执行 echo 3
,再执行 echo 2
(:inter
标签不影响程序正常执行)。
而 start
无法调用标签行的子程序,会报错(错误示范):
@ echo off
echo 1
start :inter
echo 3
: inter
echo 2
pause
报错:
1
The system cannot find the file :inter.
3
2
Press any key to continue . . .
(3)示例3:
两者执行方式的不同:
call
命令用于执行另一个批处理程序,并且在执行完成后返回到原批处理程序继续执行。它不会开启新的命令行窗口。
start
命令用于启动一个单独的窗口来运行指定的程序或命令。如果指定的是批处理文件,它也会在新的窗口中执行。
且两者等待执行完成不同:
使用call
命令时,批处理文件会等待被调用的程序或命令执行完成后才继续执行下一条命令。
使用start
命令时,如果不加/wait
参数,批处理文件不会等待启动的程序完成就继续执行下一条命令。
示例:
我们有一个外部的 e2.bat :
@echo off
echo 2
pause
测试 bat 代码 (exercise1.bat):
@echo off
echo 1
call e2.bat
echo 3
pause
运行 exercise1.bat:
文档依次运行 echo 1
, 再运行 e2.bat 中的 echo 2
和 pause
,我们按任意键后 e2.bat 运行完毕,此时再回到 exercise1.bat 运行 echo 3
。过程中只有一个窗口被打开。
如果 使用 start
@echo off
echo 1
start e2.bat
echo 3
pause
则会如图所示分别运行(两个窗口),且 exercise1.bat 里的 echo 3
不会等待 e2.bat 完全运行完毕。
(4) start
和 call
两者的其他不同,我问AI 它给了我以下回答,我还没想到例子实验。大家有问题可以评论区里讨论。
使用环境变量:
call
命令执行的程序或命令会继承当前批处理文件的环境变量。
start
命令启动的程序或命令则可能会拥有自己独立的环境变量集,这取决于具体的启动方式和参数。
用途:
call
命令通常用于执行另一个批处理文件,或者执行需要返回结果的命令。
start
命令通常用于启动独立的程序或命令,特别是那些需要在新窗口中运行的程序。
参数传递:
call
命令可以将参数传递给被调用的程序或命令。
start
命令也可以传递参数,但它还允许你设置窗口标题、工作目录等额外的选项。
备注:
这个是自学 b 站up主 程序员血月做的笔记。原视频链接:
https://space.bilibili.com/327484473/channel/seriesdetail?sid=2069394
因本人水平有限,如有任何问题,欢迎大家批评指正!