当前位置:网站首页 > 技术博客 > 正文

批处理运行cmd命令



本文主要来自批处理之家的 《批处理标准教程.pdf》

注释有二种类型:

两者略有区别:当打开 时,使用 的注释会打印出来, 的注释则不会显示出来。

注意:如果在括号中写注释,要使用 !

譬如:

 

当在括号中使用 注释时,注释的下一行一定要符合语法,不能有连续两个以 开头的注释,也不能是一个空行。

总之,为了以防万一,在括号中别用它就是了。

在运行一条命令时,这条命令本身也会显示在控制台上,譬如编写如下内容的一个 .bat 文件,双击运行

 

输出如下:

 

你可以使用 放在任何命令的前面,来关闭那个命令的回显,但是命令太多的话,一个个的关闭太过麻烦。可以使用 关闭后续所有的回显:

 

输出:

 

注意:命令自身消失了,没有出现

想要打开回显,可以使用

随意创建一个 文件,然后将后缀改为 或者 ,就是一个批处理文件了,你可以直接双击这个文件来运行,也可以将其放在 cmd 窗口中将其作为一个可执行文件来运行:

 
  • : 关闭回显,屏蔽当前命令自身的回显。
  • :用途较多。可以用来求余,显示变量,for 循环中的临时变量等。
  • :管道符号。将前一条命令的输出,作为后续命令的输入。
  • 重定向符号。
  • : 输入重定向
  • :组合命令,它的作用是用来连接 n 个 DOS 命令,并把这些命令按顺序执行,而不管是否有命令执行失败,譬如
  • : 这个命令也是把它前后两个命令连接起来,并按这些命令的顺序执行。与 & 命令不同之处在于,只有当前一条命令运行成功后,才会执行后面的命令。
  • : 连接多个命令,只有当前一条命令失败后,才会执行后续的命令,当碰到执行正确的命令后,将不执行后面所有的命令
  • : 双引号代表字符串。并且字符串内部可以嵌套变量:
    • 尽管不加双引号也可以表示字符串,但是如果字符串中间包含空格,则要加上双引号
  • : 某些情况下逗号可以被看作空格使用
  • : 可以将多行命令放在括号中,作为复合语句执行。
  • : 启动变量延迟扩展以后,变量由 的形式,要写成 的形式。

对于一些特殊符号 ,需要使用转义符 进行转义:

 

针对 ,使用 自身进行转义:

 

针对 , 没有进行延迟变量的情况下,不用转义。(关于变量延迟,见后文)

如果进行了延迟变量,需要这么做:

 

因为在延迟变量时, 有特殊含义,所以需要转义。第一次预处理会用第一个 转义第二个 ,第二次预处理会用 转义

想要获取帮助信息,可以在 cmd 命令窗口运行 , 譬如:

 

你会看到它的用法是这样的:

 

其中,所有中括号 代表了这个选项是可选的,可以有也可以没有。 代表了这个选项可以设置成 ,也就是两者之一,不能同时使用。选项的 和 是等价的: 等同于 , 并且选项是忽略大小写的:

 

批处理文件可以接受命令行参数,通过变量 , ,,等来获取。其中 代表了程序自身。 代表了传递给脚本的参数。

 

执行:

 

set 可以用来设置变量

语法:

 
  • /A : 可选参数。意思是接受一个整数,如果输入的值是字符串等类型,会将这个变量的值设为 0
  • varibale: 变量名
  • value:变量值

实例:

 

注意: 是获取变量值的固定语法。

默认声明的任何变量都是全局变量。在 和 之间声明的任何变量,都是局部变量:

 

双击运行上述文件:

 

在批处理文件中或者 cmd 的命令行中,你可以直接使用系统定义的环境变量:

 
 

注意,在声明时,字符串不用加引号!否则引号会作为字符串的一部分。

 

字符串判断时,使用双引号将字符串包裹起来,这样可以防止字符串包含空格。因为默认情况下,cmd会以 空格 将字符串分开。

 

字符串拼接很简单,只要将变量或者字符串放在一起就行,不用加引号

 

这个例子看不懂没关系,后文会讲 以及 的用法

 

选项代表了声明的是数字。并且 右侧支持数学表达式。

 

语法:

 

上面的 start,end 代表了截取字符串的起始位置,可以是正数和负数

实例: 注意负号

 

语法:

 

譬如:

 

注意如果有多个值,它是全部替换的,而不是只替换一次,而且替换是忽略大小写的!

输出:

 

使用通配符:

可以匹配任意多个字符。 可以匹配零个或一个字符。

 

看不懂没关系,后续会讲 for 循环:

 

简单说说:

  • 用来启动变量延迟,因此后面的变量,使用了 这种格式
  • for 循环来遍历大写字母,然后查找到相应的字母,进行替换。

通过 set 命令可以创建数组

 

正常修改就行

 

echo 用来打印信息

 

echo 显示消息时,还可以将中间的空格替换成任意符号:

 

pause 用来暂停程序,等待用户按下任意按键来继续:

 

不想要默认的提示信息,可以将输出重定向:

 

set 可以用来声明变量,注意等号左右不要加空格

 

set 还可以批量赋值:

 

如果变量值中带有特殊符号,譬如 ,需要加引号

 

注意:是将整个表达式都用引号包起来

选项可以将字符串变成数字,并且等号右边支持运算表达式

注意:DOS 计算只能精确到整数,小数采用四舍五入。

 

注意:等号右边的变量,可以不用加

表达式符号

没啥好说的,括号里的先执行:

加减乘除以及求余;在批处理程序中使用 求余时,要使用 来转义自身,如果是在 cmd 命令行窗口求余,则不需要转义。

 

位运算符

选项可以等待用户输入,从键盘获取内容。

语法是:

 

第三行写成: ,为什么加了个 呢?这是因为:

  • 当 有值, 起到空格的作用,此时这句命令等价于
  • 当用户没有输入值, 也没有值,这句命令此时等同于 即打印一个空行
  • 假设用户没有输入值,我们也没有使用逗号,就变成了 ,会显示 回显 状态的信息,这不是我们想要的
 

这个不换行输出的原理,我也不明白。

 

for 语句不懂,可以看下文的 for 命令部分。

简单说一下:

  • 是用来处理字符串的,他可以遍历命令的每一行输出内容, 是它的选项,这里用来设置行分隔符为空白符。
  • 单引号包裹的 是一个命令。单引号在 for /f 语句中代表了里面包裹的是命令。

set 还可以用来列出所有以某个字符串开头的变量:

 

if 命令可以进行条件判断。if 可以写成命令的格式: 也可以写成 语句,还有的形式:

 

注意

  • 圆括号的两侧要加空格!
  • 一定要和 的右括号写在一行!
  • 中不能进行数学运算如求余,求和 ...;只能进行比较运算如 大于,小于,等于...

语法:

 

实例:判断上一条命令的退出码

 
 

实例:

 
 

注意:如果判断文件夹,要在文件夹后面加上 ,因为它无法区分文件夹和文件

实例:

 

实例2:

 
 

是大于的意思,下面会讲

判断字符串,最好是用双引号包裹起来,以防字符串包含空格导致判断错误。

 
 

批处理if命令字符串比较和ASCII的关系:

  • 数字小于字母。
  • 同一个字母,小写字母小于大写字母。
  • 不同的字母,按照字母表中的顺序排列。

基础语法:

 
  • %%variable:是自定义的变量,如:;在批处理文件中使用两个百分号 ,在cmd命令行使用一个百分号
  • set: 是一个集合,可以是多个文件
  • command: 是要执行的命令,多行命令可以放在圆括号里面

譬如:

 

通配符

匹配任意多个字符。 匹配 0 或 1 个字符。

 

变量扩展

遍历文件时的变量,还支持变量扩展:关于变量扩展,见后文的《变量扩展》章节

 

批量重命名的例子:

 

选项用来处理文件夹。 无法搜索到隐藏的文件夹

 

递归遍历文件夹

选项可以递归遍历文件夹,语法:

 

可以递归遍历 path 下的文件夹,因此我们可以递归查找所有文件夹下的文件:

如果 后面不写路径,则默认是当前目录。

 

可以生成数字列表,这个功能有点像 python 的 函数,可以设置起始和终止值以及步长。

 

start : 起始值

step: 步长,起始值每次都加上这个数

end:结束值

实例:

 

用来格式化显示某个信息,它可以处理字符串,文本内容,甚至一个命令的输出信息

三种使用语法:

 

options :是如何显示信息的选项

options 的选项

delims

设置一行的分隔符,可以设置多个。默认的分隔符是空格制表符。当读取到某一行数据时,在这一行中如果遇到分隔符,程序就会将这一行进行分割。

譬如针对如下文件:

:

 

我们读取它:

 

输出:

 

你会发现,只打印了 1,3,第一行的 和第二行的 没有打印出来。这是因为每一行都用空格分割,然后打印分割后的第一个字段。

我们手动设置分隔符:

 

输出:

 

过滤空白行:

 

双引号作为分隔符

 

tokens 也是一个选项,下面会讲,多个选项可以一起使用。 的作用是转义字符。

tokens

delims 可以对每行进行分割,tokens 用来指定获取哪几个字段(哪几列)。默认获取第一个字段。

语法:

 

x, y 用来指定获取哪两个列

m-n 用来指定获取从 m 到 n 列

现有文件 a.txt 如下:

 

譬如:

默认获取第一列:

 

获取第 1,3,5,6,7列:

 

当我们通过 来指定了5个字段时,尽管在 for循环中我们只定义了一个 , 但是依然我们可以自定义四个变量来接收剩余的字段: 分别接收 这些字段

获取第一列,以及后续所有的列:

 

上面的例子,会将每一行分成 两个部分,因此文件的每一行会被分割成两块,一旦分割成两块后,后续哪怕有再多空格或者分隔符,都不会分割了,而是会当成一个整体字符串(这只是我个人猜测而已,但是和实际结果吻合):

  • 代表了第一列
  • 时通配符,代表了后续所有的字符串(注意:依然只是一个字段)

删除行前空白:

 
eol

eol 用来指定一个字符,然后 处理一行文本时,如果文本以这个字符开头,就会忽略这一行

 

指定忽略以 开头的行:

 
skip

用来跳过几行。

 
usebackq

usebackq 可以将双引号的内容作为文件,并且它会将单引号看作字符串(不使用usebackq的情况,单引号里面代表命令),将反引号看作命令。

 

譬如文件包含空格,需要加引号:

 

处理命令输出

在 这种语句中,我们将命令放在单引号中, 会自动将单引号的内容,作为命令进行执行并处理它的输出。

 

语法:, 用来跳转到 label 指定的代码处。

 

标签并不是一个函数,它只是用来标记一个代码段

后面的 可以带 也可以不带。如: 等同于 ,但是建议带上。

用来退出脚本。 是 的意思,相当于执行到程序末尾,从而变相退出脚本。

三种方式退出程序:

区别:

并不是真的退出了脚本,而是执行到文件的末尾,变相的退出程序。

彻底退出脚本。

仅退出当前的批处理脚本。

譬如编写一个 文件,在里面分别写上三种退出方式,然后我们开启一个命令行窗口,用命令行来执行这个脚本(不是直接双击运行):

  • goto :eof 会退出脚本,但是我们的命令行窗口还在。
  • exit /b 会退出批处理脚本,命令行窗口还在。
  • exit 会将我们的命令行窗口一起关闭。

启动另一个窗口运行指定的程序或命令。

语法:

 

参数:

  • 在窗口标题栏中显示的标题。
  • 起始目录
  • 新环境是传递给 cmd.exe 的原始环境,而不是当前环境
  • 开始时窗口最小化
  • 开始时窗口最大化
  • 在分开的空间内开始 16 位 Windows 程序
  • 在分共享的空间内开始 16 位 Windows 程序
  • 在 IDLE 优先级类别开始应用程序低优先级
  • 在 NORMAL 优先级类别开始应用程序 一般优先级
  • 在 HIGH 优先级类别开始应用程序高优先级
  • 在 REALTIME 优先级类别开始应用程序实时优先级
  • 在 ABOVENORMAL 优先级类别开始应用程序 超出常规优先级
  • 在 BELOWNORMAL 优先级类别开始应用程序 低出常规优先级
  • 启动应用程序并等候它结束
  • 在不创建新窗口的情况下开始应用程序。 除非启动 ^C 处理,否 则该应用程序会忽略 ^C 处理;^Break 是唯一可以中断该应用程序的方式
    • 如果是内部 cmd 命令或批文件,那么该命令处理器是用 /K 命令行开关运行 cmd.exe 的。 如: 即保留新开的cmd窗口, 可以关闭新开的窗口
    • 如果不是内部 cmd 命令或批文件,则是一个程序,并作为窗口应用程序或控制台应用程序运行。
  • 传递给前面命令或程序的参数

start 可以打开程序,路径,文件,网址等,譬如:

 

带有空格的文件夹:

 

当打开带有空格的文件夹或文件时,需要加上双引号,并且前面必须使用 title 参数,否则这个文件夹会被当成 title 参数。因此我们前面加上了一个空白的 "" 来作为 title。

call 命令来调用一个程序段或者另一个批处理文件。调用完成后,程序会从之前调用的地方继续执行(就像 python 或者 java 等调用函数一样,函数执行完毕后,会回到之前调用它的地方继续执行)

语法:

 

参数说明:

  • 指定要调用的批处理程序的位置和名称。
  • 参数必须有 或 扩展名。
  • 指定批处理程序所需的任何命令行信息,包括命令行选项、文件名、 批处理参数(即从 到 )或变量(例如,)。
  • call: Label Arguments
    • 调用本文件内命令段,相当于调用本文件内的函数。被调用的命令段以标签:label 开头,以 goto:eof 结尾,调用完后程序会回到原来的地方继续按顺序执行下去。假如被调用命令段(子程序)以 exit 结尾,那么调用完子程序后,程序就直接退出。被调用的函数应该以 作为结尾来表示函数到此截至,否则后续所有的命令都会被当作函数的一部分执行。

我们可以使用 的方式,来创建一个名为 的代码段,一个代码段仅仅是用来标记一段代码,它并不是一个函数,它不需要调用就能执行,因为它和普通代码一样,只是我们给它加了个标记而已:

 

输出:

 

来设置代码段的结尾,我们需要手动设置它来让这个代码段截止:

 

注意:后续会用 函数 一词来形容这种代码段,但是注意:它并不是真的其他编程语言中的函数。

我们可以直接调用其他批处理程序:

 

当然,后面也可以加参数:

 
 

我们可以给函数传参:

 

然后在函数中,可以通过 等来接受参数。注意: 代表了 函数或者 可执行程序路径 本身。

 

输出:

 
 

使用 和 来手动声明局部变量。其他变量都是全局变量。

输出:

 

另一个求和的例子:

 

分析一下:

  • 第二行,我们设置了
  • 第三行我们将 传递给 代码段,注意这里的 是字符串,并非变量
  • 在 中,将参数带入 , 得到: ,还记得之前说过:set 声明变量时,等号右侧的变量可以忽略 吗?因此这里右侧的 其实是全局变量 ,即:
  • shift 移动变量,然后递归 ...

shift 可以向左移动参数。该命令行 开关告诉命令从第 n 个参数开始移位;n 介于零和八之间。例如: 会将 %3 移位到 %2,将 %4 移位到 %3...,并且此时不影响 %0 和 %1

语法:

 

之前说过的求和例子:

 

设置命令行窗口名称:

 

设置命令行窗口的背景色和前景颜色(前景色即文字颜色)

它的参数是两个 16 进制数字(数字之间没有空格

支持的颜色如下:

 

譬如:

 

注意:两个颜色不能一样。

它有两个主要作用:

  • 设置 cmd 窗口的大小
  • 设置代码页
 

cols 指定宽度

lines 指定高度

 

将控制台显示语言设置成中文(936), 437 代表英文

 

命令显示和设置当前系统时间(时分秒), 选项可以仅显示时间(时分)而不设置时间。

命令显示和设置当前系统日期, 选项可以仅显示日期而不设置日期。

 

修改时间:

 

修改日期:

 

vol 可以查看磁盘卷标和序列号(如果存在)。所谓卷标,例如 , “D:” 是磁盘名,“软件” 是卷标。

 

创建、更改或删除磁盘的卷标。

语法:

 

指定驱动器

: 指定卷标

如:

 

显示或更改文件属性。

 

代表添加或删除某个属性

  • R 只读文件属性。
  • A 存档文件属性。
  • S 系统文件属性。
  • H 隐藏文件属性。
  • 指定要处理的文件路径。
  • /S 处理当前文件夹及其子文件夹中的匹配文件。
  • /D 也处理文件夹。

注意:如果将文件属性修改为系统属性后,将无法对属性再进行修改, 所以 -s 没用!

默认输出当前目录下所有文件的属性(不包含文件夹):

 

指定文件夹:

 

将文件夹设置隐藏:

 

del 删除的东西,不会到回收站。 和 命令是一样的,都是用来删除一个或多个文件,支持通配符删除。

语法:

 
  • /P 删除每一个文件之前提示确认。
  • /F 强制删除只读文件。
  • /S 从所有子目录删除指定文件(会遍历子文件夹,自动找到指定文件名的文件)。
  • /Q 安静模式。直接删除文件,不需要用户确认
  • /A 根据属性选择要删除的文件。
    • R 只读文件
    • S 系统文件
    • H 隐藏文件
    • A 存档文件
    • - 表示“否”的前缀, 如 -H 代表不是隐藏文件。

del 没有带参数的情况下,无法删除具有隐藏属性、只读属性或者系统属性的文件。

 

带对话的删除:

 

不带对话,直接删除:

 

支持通配符:

 

遍历删除:

 

这两个命令完全一样,作用都是删除一个目录。 注意:rd 不支持通配符!rd 可以删除文件和文件夹

语法:

 

/S 除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。

/Q 安静模式,删除目录时不要求确认

删除文件夹:

 

移动文件,也可以重命名文件和目录。

移动文件到目录

 

/Y:如果目录有同名文件,不提示,直接覆盖

/-Y: 如果目录有同名文件,出现提示对话,让用户确认

待移动的文件可以是 绝对路径,也可以是相对路径,也可以用通配符 *, ?

destination 是一个目录,这个目录必须事先存在(绝对路径和相对路径都可以)

实例:

 

移动文件夹

将文件夹 b 移动到文件夹 a:

 

如果移动前,目的文件夹 a 内已经包含了同名文件夹 b,则可能无法移动,提示拒绝访问。

重命名

move 不仅可以移动文件或文件夹,还可以重命名他们:

 

将一份或多份文件复制到另一个位置。copy 不可以复制文件夹,复制文件夹应该用 xcopy 命令。 copy 不可以复制具有隐藏、系统属性的文件,要复制这些文件,要先用 attrib 去除文件属性或者改用 xcopy 命令。

copy 支持通配符

 
  • source 指定要复制的文件(绝对或相对路径)
  • /A 表示以ASCII 文本复制文件。
  • /B 表示以二进位的方式复制文件。
  • /D 允许解密要创建的目标文件
  • destination 为新文件指定目录和文件名(绝对或相对路径)
  • /V 验证新文件写入是否正确。
  • /N 复制带有非 8dot3 名称的文件时, 尽可能使用短文件名。
  • /Y 不要提示,直接覆盖已存在的文件

复制到文件夹

 

复制到文件

复制时,可以指定复制后的文件名

 

合并多个文件

copy 还可以合并多个文件,并将合并结果保存下来

 

复制文件或目录树。 copy 是内部命令,xcopy 是外部命令。

 

source 指定要复制的文件。

destination 指定新文件的位置或名称。

/A 只复制有存档属性集的文件,但不改变属性。

/M 只复制有存档属性集的文件,并关闭存档属性。

/D:m-d-y 复制在指定日期或指定日期以后更改的文件。如果没有提供日期,只复制那些源时间比目标时间新的文件。

指定含有字符串的文件列 表。每一个字符串必须在文件的单独行中。如果有任何字符串与要被 复制的文件的绝对路径相符,那个文件将不会得到复制。例如,指定 如 obj 或 .obj 的字符串会排除目录 obj 下面的所有文件或带 有.obj 扩展名的文件。

/P 创建每个目标文件前提示

/S 复制目录和子目录(如果目录是空的,则不会复制)。

/E 复制目录和子目录,包括空的。与 /S /E 相同。可 以用来修改 /T。

/V 验证每个新文件。

/W 提示您在复制前按键。

/C 即使有错误,也继续复制。

/I 如果目标不存在,又在复制一个以上的文件,则假 定目标一定是一个目录。

/Q 复制时不显示文件名。

/F 复制时显示完整的源和目标文件名。

/L 显示要复制的文件。

/G 允许将没有经过加密的文件复制到不支持加密的目标。

/H 也复制隐藏和系统文件。

/R 覆盖只读文件。

/T 创建目录结构,但不复制文件。不包括空目录或子目录。/T /E 包括空目录和子目录。

/U 只复制已经存在于目标中的文件。

/K 复制属性。一般的 Xcopy 会重置只读属性。

/N 用生成的短名复制。

/O 复制文件所有权和 ACL 信息。

/X 复制文件审核设置(隐含 /O)。

/Y 复制文件审核设置(隐含 /O)。现存目标文件。

/-Y 导致提示以确认改写一个 现存目标文件。

/Z 用重新启动模式复制网络文件。

譬如:

 

复制所有内容(包括空的文件夹):

 

复制特定日期之后的内容:

 

注意:

复制一个文件夹时,它只会复制文件夹下的内容,而不是将这个文件夹复制到某处:

 

在文件中搜索字符串。

语法:

 

参数说明:

  • /V 显示不包含指定字符串的行。
  • /C 显示符合条件的行数。
  • /N 显示每一行时,同时显示行号
  • /I 搜索字符串时忽略大小写。
  • /OFF[LINE] 不要跳过具有脱机属性集的文件。
  • "string" 指定要搜索的文字串
  • 指定要搜索的文件

支持通配符,可以在多个文件中查找:

 

例子:

现有 :

 

实例:

 

和 搭配,先读取文件,然后过滤包含 '2' 的行:

 

在文件中寻找字符串

语法:

 

参数:

  • /B 在一行的开始配对模式。
  • /E 在一行的结尾配对模式。
  • /L 按字使用搜索字符串。
  • /R 将搜索字符串作为一般表达式使用。
  • /S 在当前目录和所有子目录中搜索匹配文件。有了这个参数,就不可以指定搜索路径了,否则出错。
  • /I 指定搜索不分大小写。
  • /X 打印完全匹配的行。
  • /V 只打印不包含匹配的行。
  • /N 在匹配的每行前打印行数。
  • /M 如果文件含有匹配项,只打印其文件名。
  • /O 在每个匹配行前打印字符偏移量。
  • /P 忽略有不可打印字符的文件。
  • /OFF[LINE] 不跳过带有脱机属性集的文件。
  • /A:attr 指定有十六进位数字的颜色属性。请见 "color /?"
  • /F:file 从指定文件读文件列表 (/ 代表控制台)。
  • /C:string 使用指定字符串作为文字搜索字符串。
  • /G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。
  • /D:dir 查找以分号为分隔符的目录列表 strings 要查找的文字。
  • 指定要查找的文件。

忽略大小写:

 

忽略大小写,在 a.txt 中查找包含 abc 的行

搜索 A 字符串 或 B 字符串

 

在 a.txt 中搜索 a 或者 c

注意:默认字符串中的空格,会作为分隔符分割字符串,然后将每一部分都作为单独的字段来查找,并且各字段是 的关系。

禁止空格分割:

上面说了,字符串中的空格会将字符串分割,然后用 的关系,来查找每个字符串。 可以将带有空格字符串作为一个整体进行查找:

 

上面会将 作为一个整体进行查找过滤

搜索子目录:

 

正则

findstr 支持正则表达式。

 

"<…>"表达式

这个表示精确查找一个字符串, 表示字符串的开头, 表示字符串结尾。

 

精确查找 computer 这个字符串。当然,上面的例子仅仅只是说明"<…>"的作用而已。上面程序其实 直接就 就可以了。

就是用 pushd 标记路径,然后 popd 恢复路径。可以多次 pushd 和 popd 来保存和恢复路径。其实本质就是先进后出的栈。

 

可以新建一个 cmd 命令窗口,并执行一些命令

语法:

 

参数:

  • /C 执行命令后关闭窗口
  • /K 执行命令后保留窗口
  • /S 在 /C 或 /K 后修改字符串处理(见下)
  • /Q 关闭回应
  • /D 从注册表中停用执行 AutoRun 命令(见下)
  • /A 使向内部管道或文件命令的输出成为 ANSI
  • /U 使向内部管道或文件命令的输出成为 Unicode
  • /T:fg 设置前景/背景颜色(详细信息,请见 COLOR /?)
  • /E:ON 启用命令扩展(见下)
  • /E:OFF 停用命令扩展(见下)
  • /F:ON 启用文件和目录名称完成字符 (见下)
  • /F:OFF 停用文件和目录名称完成字符(见下)
  • /V:ON 将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会允 许 !var! 在执行时允许 !var! 扩展变量 var。var 语法在输入时扩展变量,这与在一个 FOR 循环内不同。
  • /V:OFF 停用延缓的环境扩展。

实例:

 

比较两个文件或两个文件集并显示它们之间的不同

 

参数:

  • /A 只显示每个不同处的第一行和最后一行。
  • /B 执行二进制比较。
  • /C 不分大小写。
  • /L 将文件作为 ASCII 文字比较。
  • /LBn 将连续不匹配的最大值设为指定的行数。
  • /N 在 ASCII 比较上显示行数。
  • /OFF[LINE] 不要跳过带有脱机属性集的文件。
  • /T 不要将 tab 扩充到空格。
  • /U 将文件作为 UNICODE 文字文件比较。
  • /W 为了比较而压缩空白(tab 和空格)。
  • /nnnn 指定不匹配处后必须连续匹配的行数。
  • [drive1:][path1]filename1 指定要比较的第一个文件或第一个文件集。
  • [drive2:][path2]filename2 指定要比较的第二个文件或第二个文件集。

格式化磁盘

语法:

 

选项:

  • volume 指定驱动器(后面跟一个冒号)、装入点或卷名。
  • /FS:filesystem 指定文件系统类型(FAT、FAT32 或 NTFS)。
  • /V:label 指定卷标。
  • /Q 执行快速格式化。
  • /C 仅适于 NTFS: 默认情况下,将压缩在该新建卷上创建的文件。
  • /X 如果必要,先强制卸下卷。那时,该卷所有 已 打开的句柄不再有效。
  • /A:size 替代默认配置单位大小。极力建议您在一般状况 下使用 默认设置

逐屏显示输出。

从损坏的磁盘中恢复可读取的信息。

 

替换文件。

 

[drive1:][path1]filename 指定源文件。

[drive2:][path2] 指定要替换文件的目录。

/A 把新文件加入目标目录。不能和 /S 或 /U 命令行开关搭配使用。

/P 替换文件或加入源文件之前会先提示您 进行确认

/R 替换只读文件以及未受保护的文件。

/S 替换目标目录中所有子目录的文件。不 能与 /A 命令选项搭配使用。

/W 等您插入磁盘以后再运行。

/U 只会替换或更新比源文件日期早的文 件。不能与 /A 命令行开关搭配使用。

关机或注销计算机。

语法:

 
  • /i 显示图形用户界面(GUI)。
  • /l 注销。这不能与 /m 或 /d 选项一起使用。
  • /s 关闭计算机。
  • /sg 关闭计算机。在下一次启动时,重启任何注册的应用程序。
  • /r 完全关闭并重启计算机。
  • /g 完全关闭并重新启动计算机。在重新启动系统后,重启任何注册的应用程序。
  • /a 中止系统关闭。 这只能在超时期间使用。与 /fw 结合使用,以清除任何未完成的至固件的引导。
  • /p 关闭本地计算机,没有超时或警告。可以与 /d 和 /f 选项一起使用。
  • /h 休眠本地计算机。可以与 /f 选项一起使用。
  • /hybrid 执行计算机关闭并进行准备以快速启动。 必须与 /s 选项一起使用。
  • /fw 与关闭选项结合使用,使下次启动转到固件用户界面。
  • /e 记录计算机意外关闭的原因。
  • /o 转到高级启动选项菜单并重新启动计算机。必须与 /r 选项一起使用。
  • /m computer 指定目标计算机。
  • /t xxx 将关闭前的超时时间设置为 xxx 秒。有效范围是 0- (10 年),默认值为 30。如果超时时间大于 0,则默示为 /f 参数。
  • /c "comment" 有关重新启动或关闭的原因的注释。最多允许 512 个字符。
  • /f 强制关闭正在运行的应用程序而不事先警告用户。如果为 /t 参数指定大于 0 的值,则默示为 /f 参数。
  • /d [p|u:]xx:yy 提供重新启动或关闭的原因。
    • p 指示重启或关闭是计划内的。
    • u 指示原因是用户定义的。
    • 如果未指定 p 也未指定 u,则重新启动或关闭
    • 是计划外的。
    • xx 是主要原因编号(小于 256 的正整数)。
    • yy 是次要原因编号(小于 65536 的正整数)。

800 秒后自动关机

 

60秒后强制关机,并设置一个备注信息:April Fools

 

显示系统版本

以图形模式显示路径的目录结构。

语法:

 
  • /F 显示每个文件夹中文件的名称(递归目录,包含子目录)。
  • /A 使用 ASCII 字符,而不使用扩展字符。
 

显示文本文件的内容。

 

显示某个路径下的目录和文件。不指定路径,则默认显示当前路径下的所有文件和文件夹

语法:

 
  • /A : 指定目录或文件属性,如 只显示隐藏文件,支持如下属性:
    • D 目录
    • R 只读文件
    • H 隐藏文件
    • A 准备存档的文件
    • S 系统文件
    • - 表示“否”的前缀,例 如-r 为非只读文件,-h 为非隐藏文件如此等等。
  • /B 只显示文件名和扩展名。
  • /C 在文件大小中显示千位数分隔符。这是默认值。用 /-C 来停用分隔符显示。
  • /D 跟宽式相同,但文件是按栏分类列出的。
  • /L 用小写。
  • /N 新的长列表格式,其中文件名在最右边。
  • /O 用分类顺序列出文件。支持如下分类方式:
    • N 按名称(字母顺序)
    • S 按大小(从小到大)
    • E 按扩展名(字母顺序)
    • D 按日期/时间(从先到后)
    • G 组目录优先
    • - 颠倒顺序的前缀
  • /P 在每个信息屏幕后暂停。
  • /Q 显示文件所有者。
  • /S 显示指定目录和所有子目录中的文件。
  • /T 控制显示或用来分类的时间字符域
    • C 创建时间
    • A 上次访问时间
    • W 修改的时间
  • /W 用宽列表格式。
  • /X 显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,短 名称插在长名称前面。如果没有短名称,在其位置则显示空白。
  • /4 用四位数字显示年

例子:

例 1: 显示 C 盘根目录文件列表

例 2: 显示 C:program files 里面 的内容。注意:如果文件名包含空格,就必须用双引号,否则失败。 文件名不包含空格,则双引号可有可无。

例 3: 显示所有文件,包括系统文件和隐藏文件。/a 后面可以带参数,表示搜索具有指定属性的文件。 这里缺省情况下,就表示搜索所有文件。

例 4: 显示 C 盘里的系统文件及隐藏的文件及目录,其它不显示。

例 5: 显示隐藏文件及文件夹。

例 6: 只显示 C 盘的目录而不显示文件。

例 7: 只显示 C 盘的文件而不显示目录。以上都 是/a 后面带参数,表明搜索具备或者不具备(-d -r -h -a -s)指定属性的文件。

例 8: 显示 C 盘目录和文件顺序。

例 9: 目录在下面,文件在上面。

例 10: 按名称的字母顺序排列 C 盘的目录和文件。

例 11: 按名称的字母逆序排列 C 盘的目录和文件。

例 12: 按扩展名的字母顺序排列 C 盘的目录和文件。

例13: 按扩展名的字母逆序排列C盘的目录和文件。

例 14:按日期和时间顺序排列 C 盘的目录和文件(早的排前)

例 15: 按日期和时间逆序排列 C 盘的目录和文件(晚的排前)

例 16: 按文件的大小排列(大的排前)

例 17: 按文件的大小排列(小的排前)

例 18: windows 分页显示 C 盘 Windows 目录 和文件,也包括隐藏的目录和文件,并按照在文件之前分组显示。 windows 没有包含空格,那么有无双引号无所谓。

例 19: windows 分页并宽屏显示 C 盘 Windows 目录和文件,也包括隐藏的目录和文件,并按照在文件之前分组显示。

例20: 在C盘搜索regedit.exe路径。 如果要求显示详细信息,可以这么写

例 22: 搜索 F 盘每个角 落的 mp3 文件,生成列表后保存在 E 盘。

例 23: 搜索 C 盘根目录下所有以 read 开头,后面最多跟三个字符的 txt 文件。

CD 等于 CHDIR, 用来切换路径。

语法:

 

选项用来切换磁盘。譬如你从 C 盘 切换到 D 盘,必须使用这个选项。

代表上层路径

代表磁盘的根目录

例子:

 

退出 CMD.EXE 程序或当前批处理脚本。

语法:

 

/B 选项用来仅退出脚本,而非 cmd.exe 进程。

exitCode 是退出码,可选范围是 0~255

譬如可以在脚本这样写,来设置退出脚本,并设置退出码:

 

MD 等于 MKDIR,用来创建目录(也就是创建文件夹),如果文件夹已经存在,会提示。

注意:路径使用 , 而不是

 

ren 等同于 rename,用来给文件夹或文件重命名

 

注意:第一个参数是要重新命名的路径,第二个参数只能是名字,不能指定路径!

 

有一些内置变量,我们可以直接用。

最近一次执行命令的退出码。成功是 0,错误是非 0 的数值。退出码的取值范围是 0~255

返回“所有用户”配置文件的位置。

返回默认情况下应用程序存储数据的位置。

很常用!返回当前目录字符串。也就是获得当前路径,并将其转换为字符串。

返回用来启动当前的 Cmd.exe 的准确命令行。

返回当前的“命令处理程序扩展”的版本号。

返回计算机名称。

返回命令行解释器可执行程序的准确路径。也就是返回 cmd.exe 的路径,一般在C:WINDOWSsystem32cmd.exe。

返回当前日期字符串。和使用 date/t 效果一样。

返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。

返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。

返回用户的共享目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。

返回验证当前登录会话的域控制器的名称。

指定安装在计算机上的处理器数目(所有 CPU 的总核心数)。

返回操作系统名称。

系统指定可执行文件的搜索路径。也就是在这些目录下的可执行文件,其实就是系统环境变量。

返回操作系统认为可执行的文件扩展名的列表。

返回处理器的芯片体系结构。返回值为 x86 或 IA64或 RISC。这些都是常见的架构,或者称作指令集。

返回处理器说明。

返回计算机上安装的处理器型号。

返回处理器版本号。

返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。

返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。

返回包含Windows server operation system根目录(即系统根目录)的驱动器。

返回 Windows server operation system 根目录位置。

用户返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。

返回当前时间字符串。使用与 time /t 命令相同的格式。

返回包含用户账户的域的名称。

返回当前登录的用户的名称。

返回当前用户的配置文件的位置,即当前用户的家目录

返回操作系统目录的位置。

我的电脑上执行结果:

echo %errorlevel% 0 echo %ALLUSERSPROFILE% C:ProgramData echo %APPDATA% C:UserswztshineAppDataRoaming echo %CD% C:UserswztshineDesktopbat_test echo %CMDCMDLINE% C:Windowssystem32cmd.exe /c ""C:UserswztshineDesktopbat_test est.bat" " echo %CMDEXTVERSION% 2 echo %COMPUTERNAME% DESKTOP-DCBC2US echo %COMSPEC% C:Windowssystem32cmd.exe echo %DATE% 2022/05/20 周五 echo %HOMEDRIVE% C: echo %HOMEPATH% Userswztshine echo %HOMESHARE% ECHO 处于关闭状态。 echo %LOGONSERVER% DESKTOP-DCBVSO echo %NUMBER_OF_PROCESSORS% 4 echo %OS% Windows_NT echo %PATH% D:AZpy3.10.1Scripts;D:AZpy3.10.1; ..... echo %PATHEXT% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW echo %PROCESSOR_ARCHITECTURE% AMD64 echo %PROCESSOR_IDENTFIER% ECHO 处于关闭状态。 echo %PROCESSOR_LEVEL% 6 echo %PROCESSOR_REVISION% 3c06 echo %PROMPT% $P$G echo %RANDOM% 19717 echo %SYSTEMDRIVE% C: echo %SYSTEMROOT% C:Windows echo %TEMP% %TMP% C:UserswztshineAppDataLocalTemp C:UserswztshineAppDataLocalTemp echo %TIME% 14:05.9 echo %USERDOMAIN% DESKTOP-DCBC2CN echo %USERNAME% wztshine echo %USERPROFILE% C:Userswztshine echo %WINDIR% C:Windows

可以设置变量延迟。

先看一个很简单的例子,猜测一下输出结果是啥:

 

输出:

 

为什么输出了 呢?按道理说,应该输出两次 才对。

这是因为 后面的圆括号以及圆括号里面的所有命令,都会被当作一条完整的语句来进行预处理,所谓预处理,就是先将语句中所有的变量 ,都用变量的值替换掉。

程序执行到 语句时,找到语句中的变量 ,并用它的值 来替换,因此 语句中,就变成了这样:

 

所谓变量延迟,就是禁用预处理,让变量实时的更新。但是需要注意的是,要实时更新的变量,不能再用 这种格式,而是要用 这种格式

启用变量延迟:

 

输出:

 

注意:

以后所有的复合语句(“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句),如果要实时更新某个变量,都要使用变量延迟!否则预期结果可能和你猜想的不同。

首先要明白什么是“复合语句”,所谓“复合语句”就是指一对 里的所有命令。比如 的 后面,如:

 

当然,不仅仅是 命令的括号里面是复合语句,实际上,所有用圆括号包裹的命令,都是复合语句。通过管道命令 连接起来的命令也是复合语句。

如果在复合语句之外引用变量,则使用 或 都是可以的。若想在复合语句中使用实时的变量,则必须使用 。如果在复合语句中还是使用 变量,那么得到的变量将是复合语句之前 的值,此时如果 在复合语句之前没有定义,那么值为空值

在使用命令行参数时,或者在使用 这种变量时,我们可以对 或者 这种变量进行扩展,让它拥有更多变化:

以命令行参数为例子:

 

num 是第几个参数,如 0,1,2,...

flag 是可选项,有如下几种,并且可以组合一起:

  • d : 获取驱动器号
  • f : 文件路径
  • p :文件夹路径
  • n :文件名(不带后缀)
  • x :后缀名
  • s :文件路径的短名
  • a :文件属性
  • t :文件修改日期和时间
  • z :文件大小
  • $PATH :查找环境变量中的路径
  • dp:获取驱动器和路径
  • nx :获取文件名和后缀
  • ftza :文件的路径,时间,大小等信息,类似于 命令的输出

flag 如果不写,则去除参数的引号,如果不知道路径带不带引号,用它非常有用。

实例:

 

双击运行,输出:

 

关于 , 我们可以写个简单的例子,查找默认 的路径:

 
  1. 不要写太复杂的语句,一旦写复合语句,切记要设置变量延迟
  2. 写较长的脚本时,最好边写边测试,别一次性写完,然后发现执行不通。因为 bat 没有好的调试方法:只能关闭 echo off,使用 pause 一行一行的调试,费时费力。
  3. 尽量不要用一些特殊字符作为注释,譬如
  4. 在 for 循环等复合语句中(括号之中),慎用 来注释,可以使用 来注释

  • 上一篇: 备忘录形式是什么样的
  • 下一篇: jwt依赖包
  • 版权声明


    相关文章:

  • 备忘录形式是什么样的2024-11-14 23:01:04
  • 网络攻防战是什么2024-11-14 23:01:04
  • logistic逻辑回归分析2024-11-14 23:01:04
  • yolov5的激活函数2024-11-14 23:01:04
  • deep machine learning2024-11-14 23:01:04
  • jwt依赖包2024-11-14 23:01:04
  • 看上去好坑的运算符重载2024-11-14 23:01:04
  • 异或和怎么算2024-11-14 23:01:04
  • 匿名内部类可以实现接口吗2024-11-14 23:01:04
  • crc16计算方法2024-11-14 23:01:04