Board logo

标题: [其他] CMD批处理 基本教程(零基础版)本人等级不够发到教程板块,望管理帮忙转载,非常感谢 [打印本页]

作者: LTSC1809    时间: 2023-10-4 19:55     标题: CMD批处理 基本教程(零基础版)本人等级不够发到教程板块,望管理帮忙转载,非常感谢

本帖最后由 LTSC1809 于 2023-10-6 15:02 编辑

序章:前言
这是一篇针对Windows CMD批处理文件的教程。编写时使用环境为Microsoft Windows 10 Version 1809。
这篇教程是针对初次接触计算机编程或仅有少量基础人群的。如果你有一定的编程基础,请参阅:[url=about:blank]暂缺,以后写完了再补上[/url]。这篇教程也许看起来不那么啰嗦,没有过多的介绍基础部分。
正式开始教程。首先,如果打开了这个论坛,又打开了这篇教程,一定事想要学习WindowsCmd批处理的罢!
CMD批处理的主要作用我也简单讲一下:它运行在Windows环境下,顾名思义 批处理 即多个操作的集合。在批处理文件中有各种各样的指令来完成各种操作。把它们写在一个文本文件中,写一句换一行,后缀名改为.bat,双击运行,文件中的内容即会从上到下的逐个运行,直到最后一条命令执行结束,程序退出。
使用批处理文件可以完成一些简单的重复性操作,如开机后一键启动许多需要的应用程序,如批量重命名等等等等。
如觉得有哪里内容不妥或不正确,欢迎随时纠正,经核实会修改。
作者: LTSC1809    时间: 2023-10-4 19:56

第1章:基本结构和语法
前言中提到,批处理文件即多条命令的集合。那么,学习批处理,也就是学习这些命令的语法。
那么,首先来看一个批处理程序:
  1. @echo off
  2. echo test
  3. pause
复制代码
看不懂?没关系,我来解释。

第一行: @echo off
echo off:意为关闭回显。回显是什么呢?打开一个CMD窗口,你会看到一些内容,包括当前路径等等,并让你输入命令。就像这样:
C:\Users\Administrator\>
输入一条命令,按下回车,命令被执行,返回的内容被显示在CMD窗口里。而这个C:\Users\Administrator\>就是回显。如果你不关闭回显,那么批处理文件中的每一行运行都会显示出"C:\Users\Administrator\>命令"
这样显然不美观,阅读也不方便。而输入echo off后,则不再有这个提示,直接输出命令执行结果到屏幕上。
至于@符号的作用,即关闭当前行的回显。因为echo off这行后面的内容才会被关闭回显,而这行本身还是会出现这种回显信息,还要使用@符号来让这行也不要显示。

第二行:echo test
echo就是一个命令。它有两个作用,第一个就是刚刚提到的echo off/on来开关回显,另一种就是输出信息。用法是echo 文本。所以这一行的作用就是在cmd窗口内显示test这四个字符。

第三行:pause
pause也是一个命令。作用是当执行到这一行,暂时不继续执行下一行,而是在窗口内显示“请按任意键继续...”等待用户按下键盘上的任意按键,按下后继续执行下一行命令。在这个程序中,由于pause的下一行没有指令了,所以运行完pause cmd检测不到指令就会直接退出。
这里如果不加pause,那么执行完上一行就会检测不到下一行有指令而立刻退出,导致闪退,我们也还没来得及看到显示内容 程序就直接退出了。

请记住一定要自己去实际建立一个bat文件尝试一下。光看是永远学不会的。如果你不会改文件扩展名,请使用搜索引擎来获得帮助。如有报错或闪退等情况,仔细检查你的命令语法是否有问题。
作者: LTSC1809    时间: 2023-10-4 20:20

本帖最后由 LTSC1809 于 2023-10-5 23:12 编辑

第2章:变量
变量是批处理中极为重要的一个部分。如果连变量都不能正确的使用,那你大概率没有办法使用批处理的大部分强大功能。
变量,你可以理解为一个存储数据的容器。cmd中使用set命令来操作变量。如:set a=test意为 将test这串字符放到一个叫a的变量里
批处理中读取变量使用%变量名%,两个百分号括着变量名这样的方式来实现。变量名可以是一个或多个字母,可以包含数字,但不能包含中文。
如:
@echo off
set a=test
echo %a%
pause
结果屏幕上会显示出test这串字符。
抛去之前讲过的第一行和最后一行不谈,我们来看看这段代码。
首先set a=test 把test这串字符存进一个叫a的变量。
echo %a% 读取变量的方式是%变量名%,这一语句的意思也就是显示叫做a的变量存储的内容。
所以,得到输出test。
而set语句还有许多变种,使用不同的开关来实现。
什么?你问开关是什么意思?
开关,在批处理中指命令后面加上的一些调整这条命令功能的字符。开关可以以 命令/开关名 的方式来使用。(也可以是使用-代替/,但是这样做则必须要在命令和开关名之间加上一个空格。使用/的情况下你也可以加上空格,这也不是错误的。)一个命令可以有许多个开关,如果你使用了-来调用开关,你需要在每个开关之间也加上空格,如果使用/则不需要,直接连着输入就行(同理加上也不是不对)
set命令的常用开关有:
/p
/a
另外,所有命令加上开关/?然后直接回车,不输入任何其他内容,则会输出这个命令的详细用法。但是有大量英文内容且不是很容易看懂。但它是官方帮助,内容比你在百度上找的绝对要靠谱,读懂了的话它是非常好的帮助。当你遇到问题时,可以先尝试一下这个操作。有时很有用。

/p开关的作用为接受用户输入。例子:
set /p a=请输入:
什么意思呢?我们来运行看看。
运行后,会显示“请输入:”这四个字,你此时可以输入内容。输入完内容,按下回车,你刚刚输入的内容就会被存到叫做a的变量里面。
这很有用,交互功能是非常重要的。

/a开关的作用为计算数值。例子:
set /a c=114+514
然后echo %c%
结果显示了628,也就是114+514的结果。
把等号后面的算式结果存到等号前面的变量里面。此处变量名为c。
这个命令也可以计算变量。比如
set a=114
set b=514
set /a c=a+b
echo %c%
显示内容还是628。
set命令中如果需要调用其他变量(此处的a和b),不需要加上双百分号。

请记住一定要自己去实际建立一个bat文件尝试一下。光看是永远学不会的。如果你不会改文件扩展名,请使用搜索引擎来获得帮助。如有报错或闪退等情况,仔细检查你的命令语法是否有问题。
作者: LTSC1809    时间: 2023-10-4 21:27

第3章:流程控制语句
流程控制语句,顾名思义就是控制流程的语句(废话)
它们可以改变命令的执行顺序 等等。
首先请看:if
if命令可以用于判断条件是否成立,如果成立则执行某些内容。
举个例子:
  1. @echo off
  2. set /p a=请输入数字:
  3. if %a% equ 1=echo 你输入的是1
  4. pause
复制代码
什么意思呢
还是抛开第一行和最后一行,首先使用set /p语句来获取用户输入。
重点来了,第三行的内容 意为 判断a这个变量内容是否等于1,如果是 则显示:你输入的是1。如果不是,则什么也不会做,会直接跳到下一行。
%a%读取叫做a的变量的内容
equ 是批处理if语句中的“相等”逻辑运算符。if中还有:
gtr:大于
neq:不等于
lss:小于
leq:小于等于
geq:大于等于
所以 %a% equ 1也就是变量a的内容是否等于1的意思。
而等于号后面 则是如果条件成立则执行的语句
你可以使用等号来代表执行的语句,也可以使用一个空格。
如果需要执行多个语句,你可以使用小括号:
if %a% equ 1 (第一条命令
第二条命令
......)
如果你遇到了括号内变量调用出现问题,不必惊慌,这是一个复杂的问题,后面会详细讲解。

goto指令的作用为:跳转到某个标签
标签是什么呢?标签使用:标签名定义
比如下列代码:
  1. @echo off
  2. set /p a=请输入数字:
  3. if %a% equ 1=goto i
  4. echo 你输入的不是1
  5. pause
  6. exit
  7. :i
  8. echo 你输入的是1
  9. pause
  10. exit
复制代码
也许你已经注意到了exit这一行,那就先讲讲这个吧。
exit,执行到这一行就会立刻退出程序。
相信聪明的你可能已经看出来goto的用法了
goto的语法:goto 标签名(有些人可能习惯给这里的标签名前面加上冒号,也是对的)
而作用就是 跳转到标签所在的地方,从这个标签下面一行开始继续执行,而跳过中间的内容。
请记住一定要自己去实际建立一个bat文件尝试一下。光看是永远学不会的。如果你不会改文件扩展名,请使用搜索引擎来获得帮助。如有报错或闪退等情况,仔细检查你的命令语法是否有问题。
作者: Five66    时间: 2023-10-5 11:49

感觉批处理挺难的
作者: LTSC1809    时间: 2023-10-5 23:06

本帖最后由 LTSC1809 于 2023-11-25 21:31 编辑

第4章:For语句
for语句严格来讲也是流程控制语句的一部分,但是看到我单独拉出来讲,想必一定认识到了它的重要性。
For语句在CMD中有着许多的作用,并且有许多扩展语法。这可能不是很容易学会。
首先看最基础的For语句。For语句的作用事遍历输入的每个元素,并执行某些命令。你可能没懂,没关系,看个例子就知道了。
  1. for %%i in (a,b,c) do echo %%i
复制代码
运行后会输出:
  1. a
  2. b
  3. c
复制代码
解释亿下:
%%i事形式变量,事一种在for语句中专用的变量(批处理文件中使用双百分号跟名称的方式表示,名称只能一个字母,而一般变量可以多个字母。如果在cmd窗口中直接输入命令执行 那么只需使用单百分号)。它代表了当前遍历到的元素。
in后面跟的括号里面写的内容默认使用逗号分隔,它们就是刚刚所说的输入的元素。
有多少个元素,do后面的语句就会执行几次。
执行时,例如有三个元素,那么%%i这个形式变量的内容第一次运行时内容为第一个元素,第二次运行时内容为第二个元素,第三次运行则为第三个元素。
所以,在这个例子中,第一次执行时%%i内容事第一个元素(也就是a),第二次事第二个元素(b)... echo出的内容也就是第一次为a 第二次为b...
如果你需要在do中执行多行指令,那么你可以使用前面提到的小括号。

而这只是for的基础用法 它还有以下常用的开关:
/f
/l
for /f:主要用于文本处理 并可以读取文件。语法:
for /f %%i in (文件路径) do echo %%i
这个语句传入的文件名(文本文件)也就相当于普通for的传入对象。文本中的每一行都是一个单独的对象,所以这行代码会逐句输出整个文本。而它也是有分隔符的,为了防止文件中出现逗号而导致读取异常,可以使用delims这个配置。这一类的配置这样使用:
注意,for中 in后面跟随的括号 里面输入用双引号包裹的变量或是字符串,也可以被操作。
for /f "配置名称" %%i in.....
而delims这个配置,可以设置分隔符。使用"delims=分隔符"来设置。如果你输入"delims=",不输入分隔符,那么也就是不使用分隔符,也就不会因为文本中出现逗号导致读取异常了(注意,仍然有一些特殊符号如!可能读取不到,这很难解决。如果只需要显示整个文件,建议使用type 文件路径)
for /f的所有配置:
usebackq:加上这条配置,则括号里可以输入双引号来包裹路径。(这涉及到批处理中一个问题,路径如果包含空格那么会被从空格的地方截断。这会导致无法正确使用路径。所以批处理中包含空格的路径可以使用双引号包裹 来让它被正常识别。但是for /f中一般情况下路径不能加双引号,所以使用这个配置来解决路径包含空格的问题。)
tokens:决定读取第几段内容,"tokens=段数(数字)"。也就是分隔符作用下被分开的多个对象,具体是第几个。for /f中 这可以被用作读取文本的其中一行之中又有分隔符,来指定读取这一行的第几段。
skip:忽略文本开头的一些行数。"skip=行数(数字)",如果使用了这个配置,那么文本的第一行至输入行数会被忽略,从下一行开始读取。
eol:指定一个字符/一个字符串,遇到这个字符/字符串开头的某一行就忽略掉这一行。"eol=字符"
如果一个for语句使用多个配置 那么在一对双引号里写上所有的配置。每个不同的配置之间用空格分隔。如 for /f "usebackq eol=' delims=" %%i in ("aaa.txt") do echo %%i

再来讲讲/l开关。它用于循环执行指定的次数。
for /l %%i in (起始数字,步长,终止数字) do 执行命令
从起始数字开始 每执行一次 计数器都加步长,直到计数器数字等于终止数字。如:for /l %%i in (50,2,100) do echo %%i
意为从五十开始计数,每次运行 加二,直到数字等于100,每次执行都输出当前计数器的数字。请注意如果步长设置的不能正好加到终止数字的大小,那么当计数器大于终止数字的时候会结束循环。如果步长设置为负数如-1,每运行一次计数器加上负一,也就是减一。可以使计数器递减 直到其小于等于终止数字。
这篇写的挺长的。for的用法还有许多没有讲到,但是基本都不常用。这章内容难度急剧上升,看不懂可以多看几遍 百度 或者发帖提问(注意不要水帖,会严重影响别人阅读)。可能有的大佬已经想说我有重要的一点没说了 别着急质问,会有单独的一章讲这个。
请记住一定要自己去实际建立一个bat文件尝试一下。光看是永远学不会的。
作者: Batcher    时间: 2023-10-6 13:50

回复 3# LTSC1809


变量名可以是一个或多个字母,可以包含数字,但不能包含中文

3楼的这个观点是错误的。希望大家不要被误导。
作者: Batcher    时间: 2023-10-6 14:01

回复 6# LTSC1809


6楼有几个错误的说法,包括但不限于:
%%i事形式变量,事一种在for语句中专用的变量(批处理文件中使用双百分号跟名称的方式表示,名称只能一个字母,而一般变量可以多个字母。均不能使用中文。

除了可以是字母之外,数字、字符、中文,都可以。
如果你输入"delims=",不输入分隔符,那么也就是不使用分隔符,也就不会因为文本中出现逗号导致读取异常了

通常情况下,逗号不会导致读取异常。
作者: LTSC1809    时间: 2023-10-6 14:54

回复 8# Batcher


    感谢指出,核实后会做出修改。
作者: LTSC1809    时间: 2023-10-6 14:56

回复 8# Batcher

您好!感谢您的纠正!变量名称问题经过测试,确实可以。但是关于for /f,经过读取一个文本测试,文本中所有的空格处以及逗号都被当作分隔符 它们后面的内容以及它本身全都没有打印出来。
作者: Batcher    时间: 2023-10-6 15:52

回复 10# LTSC1809


    多说无益,请发测试用例。
作者: LTSC1809    时间: 2023-10-6 16:17

回复 11# Batcher


    就用本帖的一楼举例 复制下来内容是这样的:
  1. 序章:前言
  2. 这是一篇针对Windows CMD批处理文件的教程。编写时使用环境为Microsoft Windows 10 Version 1809。
  3. 这篇教程是针对初次接触计算机编程或仅有少量基础人群的。如果你有一定的编程基础,请参阅:[url=about:blank]暂缺,日后写完再补上[/url]。这篇教程没有过多的赘述基础部分,也许对有基础阅读起来更省力更方便。
  4. 正式开始教程。首先,如果打开了这个论坛,又打开了这篇教程,一定事想要学习WindowsCmd批处理的罢!
  5. CMD批处理的主要作用我也简单讲一下:它运行在Windows环境下,顾名思义 批处理 即多个操作的集合。在批处理文件中有各种各样的指令来完成各种操作。把它们写在一个文本文件中,写一句换一行,后缀名改为.bat,双击运行,文件中的内容即会从上到下的逐个运行,直到最后一条命令执行结束,程序退出。
  6. 使用批处理文件可以完成一些简单的重复性操作,如开机后一键启动许多需要的应用程序,如批量重命名等等等等。
复制代码
第三行的“暂缺”两个字后面有一个逗号(只是英文逗号),我将这段内容保存在txt文件中 使用如下代码:(直接在cmd窗口中一条条输入 按回车)
echo off&cls
for /f %i in (C:\Users\Administrator\Desktop\test.txt) do echo %i
运行后使用crtl+f搜索逗号(确认输入的就是文本中的那种英文逗号),但是却没有任何结果。
如您认为我的测试方法或结果有不妥,请指出问题所在 并给出正确的方式。
作者: Batcher    时间: 2023-10-6 21:40

回复 12# LTSC1809


    经测试,没有你说的那回事。建议给出截图:你认为应该是怎样的?代码实际得到的结果是怎样的?
作者: qixiaobin0715    时间: 2023-10-7 14:17

本帖最后由 qixiaobin0715 于 2023-10-7 14:22 编辑

下面是实测情况,也没出现楼主所说的结果:
  1. C:\Users\Administrator>@echo off
  2. for /f %i in ("这篇教程是针对初次接触计算机编程或仅有少量基础人群的。如果你有一定的编程基础,请参阅:[url=about:blank]暂缺,日后写完再补上[/url]。这篇教程没有过多的赘述基础部分,也许对有基础阅读起来更省力更方便。") do echo,%i
  3. 这篇教程是针对初次接触计算机编程或仅有少量基础人群的。如果你有一定的编程基础,请参阅:[url=about:blank]暂缺,日后写完再补上[/url]。这篇教程没有过多的赘述基础部分,也许对有基础阅读起来更省力更方便。
复制代码
前两行是在命令提示符下输入的内容,最后一行是显示的实际结果。执行后直接在窗口中复制上来的,未做任何改动。
作者: qixiaobin0715    时间: 2023-10-7 16:16

本帖最后由 qixiaobin0715 于 2023-10-7 16:19 编辑

!在开启变量延迟下会出现读取不到的情况,许多许多年以前这个问题已有解决方案,主要方法是推后开启变量延迟。参见:
http://bbs.bathome.net/viewthrea ... &from=favorites
作者: 加朝宇    时间: 2023-10-11 21:30

求更新            。。。。
作者: JinhongLei    时间: 2023-11-23 23:33

回复 3# LTSC1809
写的很详细




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2