1、常用命令
需要注意,bat 脚本在cmd执行时,通常默认的编码为 GBK,并且换行风格为 CRLF。在最新的记事本编写bat时保存的编码默认已经是utf-8,需要做转换,否则有中文时会乱码。
通过 help + 命令
命令可以查看某个命令的用法。或者使用命令 command /?
,例如 choice /?
。
cd
显示当前目录名或改变当前目录。
CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]
.. 指定要改成父目录。
键入 CD drive: 显示指定驱动器中的当前目录。
不带参数只键入 CD,则显示当前驱动器和目录。
使用 /D 开关,除了改变驱动器的当前目录之外,
还可改变当前驱动器。
如果命令扩展被启用,CHDIR 会如下改变:
当前的目录字符串会被转换成使用磁盘名上的大小写。所以,
如果磁盘上的大小写如此,CD C:\TEMP 会将当前目录设为
C:\Temp。
CHDIR 命令不把空格当作分隔符,因此有可能将目录名改为一个
带有空格但不带有引号的子目录名。例如:
cd \winnt\profiles\username\programs\start menu
与下列相同:
cd "\winnt\profiles\username\programs\start menu"
在扩展停用的情况下,你必须键入以上命令。
dir
显示目录中的文件和子目录列表。
DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]
[drive:][path][filename]
指定要列出的驱动器、目录和/或文件。
/A 显示具有指定属性的文件。
属性 D 目录 R 只读文件
H 隐藏文件 A 准备存档的文件
S 系统文件 I 无内容索引文件
L 重新分析点 O 脱机文件
- 表示“否”的前缀
/B 使用空格式(没有标题信息或摘要)。
/C 在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
禁用分隔符显示。
/D 跟宽式相同,但文件是按栏分类列出的。
/L 用小写。
/N 新的长列表格式,其中文件名在最右边。
/O 用分类顺序列出文件。
排列顺序 N 按名称(字母顺序) S 按大小(从小到大)
E 按扩展名(字母顺序) D 按日期/时间(从先到后)
G 组目录优先 - 反转顺序的前缀
/P 在每个信息屏幕后暂停。
/Q 显示文件所有者。
/R 显示文件的备用数据流。
/S 显示指定目录和所有子目录中的文件。
/T 控制显示或用来分类的时间字符域
时间段 C 创建时间
A 上次访问时间
W 上次写入的时间
/W 用宽列表格式。
/X 显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,
短名称插在长名称前面。如果没有短名称,在其位置则
显示空白。
/4 以四位数字显示年份
可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。
copy
将一份或多份文件复制到另一个位置。
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B]
[+ source [/A | /B] [+ ...]] [destination [/A | /B]]
source 指定要复制的文件。
/A 表示一个 ASCII 文本文件。
/B 表示一个二进位文件。
/D 允许解密要创建的目标文件
destination 为新文件指定目录和/或文件名。
/V 验证新文件写入是否正确。
/N 复制带有非 8dot3 名称的文件时,
尽可能使用短文件名。
/Y 不使用确认是否要覆盖现有目标文件
的提示。
/-Y 使用确认是否要覆盖现有目标文件
的提示。
/Z 用可重新启动模式复制已联网的文件。
/L 如果源是符号链接,请将链接复制
到目标而不是源链接指向的实际文件。
命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批处理脚本中执行的,默认值应为
在覆盖时进行提示。
要附加文件,请为目标指定一个文件,为源指定
数个文件(用通配符或 file1+file2+file3 格式)。
xcopy
复制文件和目录树。
XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
[/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
[/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/J]
[/EXCLUDE:file1[+file2][+file3]...] [/COMPRESS]
source 指定要复制的文件。
destination 指定新文件的位置和/或名称。
/A 仅复制有存档属性集的文件,
但不更改属性。
/M 仅复制有存档属性集的文件,
并关闭存档属性。
/D:m-d-y 复制在指定日期或指定日期以后更改的文件。
如果没有提供日期,则只复制
源时间比目标时间新的文件。
/EXCLUDE:file1[+file2][+file3]...
指定含有字符串的文件列表。每个字符串
在文件中应位于单独的一行。如果任何
字符串与复制文件的绝对路径的任何部分相符,
则排除复制该文件。例如,
指定如 \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 取消提示以确认要覆盖
现有目标文件。
/-Y 触发提示,以确认要覆盖
现有目标文件。
/Z 在可重新启动模式下复制网络文件。
/B 复制符号链接本身与链接目标。
/J 复制时不使用缓冲的 I/O。推荐复制大文件时使用。
/COMPRESS 如果适用,在传输期间请求网络
压缩。
开关 /Y 可以预先在 COPYCMD 环境变量中设置。
这可能被命令行上的 /-Y 覆盖。
mkdir、md
创建目录。
MKDIR [drive:]path
MD [drive:]path
如果命令扩展被启用,MKDIR 会如下改变:
如果需要,MKDIR 会在路径中创建中级目录。例如: 假设 \a 不
存在,那么:
mkdir \a\b\c\d
与:
mkdir \a
chdir \a
mkdir b
chdir b
mkdir c
chdir c
mkdir d
相同。如果扩展被停用,则需要键入 mkdir \a\b\c\d。
choice
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
描述:
该工具允许用户从选择列表选择一个项目并返回所选项目的索引。
参数列表:
/C choices 指定要创建的选项列表。默认列表是 "YN"。
/N 在提示符中隐藏选项列表。提示前面的消息得到显示,
选项依旧处于启用状态。
/CS 允许选择分大小写的选项。在默认情况下,这个工具
是不分大小写的。
/T timeout 做出默认选择之前,暂停的秒数。可接受的值是从 0
到 9999。如果指定了 0,就不会有暂停,默认选项
会得到选择。
/D choice 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选
项指定的一组选择中; 同时,必须用 /T 指定 nnnn。
/M text 指定提示之前要显示的消息。如果没有指定,工具只
显示提示。
/? 显示此帮助消息。
注意:
ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选
择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,
该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的
ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0
的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降
序排列。
示例:
CHOICE /?
CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"
del
删除一个或多个文件。
DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
names 指定一个或多个文件或者目录列表。
通配符可用来删除多个文件。
如果指定了一个目录,该目录中的所
有文件都会被删除。
/P 删除每一个文件之前提示确认。
/F 强制删除只读文件。
/S 删除所有子目录中的指定的文件。
/Q 安静模式。删除全局通配符时,不要求确认
/A 根据属性选择要删除的文件
属性 R 只读文件 S 系统文件
H 隐藏文件 A 准备存档的文件
I 无内容索引文件 L 重新分析点
O 脱机文件 - 表示“否”的前缀
如果命令扩展被启用,DEL 和 ERASE 更改如下:
/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。
start
启动一个单独的窗口以运行指定的程序或命令。
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
[command/program] [parameters]
"title" 在窗口标题栏中显示的标题。
path 启动目录。
B 启动应用程序,但不创建新窗口。
应用程序已忽略 ^C 处理。除非应用程序
启用 ^C 处理,否则 ^Break 是唯一可以中断
该应用程序的方式。
I 新的环境将是传递
给 cmd.exe 的原始环境,而不是当前环境。
MIN 以最小化方式启动窗口。
MAX 以最大化方式启动窗口。
SEPARATE 在单独的内存空间中启动 16 位 Windows 程序。
SHARED 在共享内存空间中启动 16 位 Windows 程序。
LOW 在 IDLE 优先级类中启动应用程序。
NORMAL 在 NORMAL 优先级类中启动应用程序。
HIGH 在 HIGH 优先级类中启动应用程序。
REALTIME 在 REALTIME 优先级类中启动应用程序。
ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。
BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。
NODE 将首选非一致性内存结构(NUMA)节点指定为
十进制整数。
AFFINITY 将处理器关联掩码指定为十六进制数字。
进程被限制在这些处理器上运行。
将 /AFFINITY 和 /NODE 结合使用时,会对关联掩码
进行不同的解释。指定关联掩码,以便将零位作为起始位置(就如将 NUMA
节点的处理器掩码向右移位一样)。
进程被限制在指定关联掩码和 NUMA 节点之间的
那些通用处理器上运行。
如果没有通用处理器,则进程被限制在
指定的 NUMA 节点上运行。
WAIT 启动应用程序并等待它终止。
command/program
如果它是内部 cmd 命令或批文件,则
该命令处理器是使用 cmd.exe 的 /K 开关运行的。
这表示运行该命令之后,该窗口
将仍然存在。
如果它不是内部 cmd 命令或批文件,则
它就是一个程序,并将作为一个窗口化应用程序或
控制台应用程序运行。
parameters 这些是传递给 command/program 的参数。
注意: 在 64 位平台上不支持 SEPARATE 和 SHARED 选项。
通过指定 /NODE,可按照利用 NUMA 系统中的内存区域的方式
创建进程。例如,可以创建两个完全
通过共享内存互相通信的进程以共享相同的首选 NUMA 节点,
从而最大限度地减少内存延迟。只要有可能,
它们就会分配来自相同 NUMA 节点的
内存,并且会在指定节点之外的处理器上自由运行。
start /NODE 1 application1.exe
start /NODE 1 application2.exe
这两个进程可被进一步限制在相同 NUMA 节点内的指定处理器
上运行。在以下示例中,application1 在
节点的两个低位处理器上运行,而 application2
在该节点的其后两个处理器上运行。该示例假定指定节点至少具有四个逻辑处理器。请注意,节点号可更改为该计算机的任何有效节点号,
而无需更改关联掩码。
start /NODE 1 /AFFINITY 0x3 application1.exe
启动 /NODE 1 /AFFINITY 0xc application2.exe
如果命令扩展被启用,通过命令行或 START 命令的外部命令
调用会如下改变:
将文件名作为命令键入,非可执行文件可以通过文件关联调用。
(例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和
FTYPE 命令。
执行的应用程序是 32 位 GUI 应用程序时,CMD.EXE 不等应用
程序终止就返回命令提示符。如果在命令脚本内执行,该新行为
则不会发生。
如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
字符串 "CMD","CMD" 会被 COMSPEC 变量的数值所替换。这
防止从当前目录提取 CMD.EXE。
如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
名。PATHEXT 变量的默认值是:
.COM;.EXE;.BAT;.CMD
请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。
查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
与目录名相配。如果确实如此,START 会在那个路径上调用
Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。
call
- 第一种用法,也就是最常用的一种,调用另一个批处理,在被调用的批处理执行完后在执行call下面的命令。如:
@echo off
call a.bat
dir c:\
pause
如果在被调用的批处理里面有参数,调用的时候需要在后面加上参数。
如:
a.bat内容:
@echo off
echo %0 %1
b.bat内容:
@echo off
call a.bat hello
dir c:\
pause
那么,在执行b.bat的时候,会将hello赋值给%1,而%0代表a.bat自己。
(在批处理中,可以使用%*代表所有参数%1-%9代表9个参数,%0代表批处理自己,其扩展用法见call /?,在讲for的时候也会讲到)
goto :eof
的用法,如:
a.bat内容:
@echo off
echo %0 %1
goto :eof
b.bat内容:
@echo off
call a.bat hello
dir c:\
pause
这里,在显示完hello
后,会执行dir c:\
并暂停,如果将goto :eof
改成exit
,在显示完hello
后就会自动退出。因为goto :eof
后会转到a.bat
结尾,即只退出a.bat
然后会继续执行dir
;由于call a.bat
,在执行a.bat
和b.bat
是一个CMD
窗口,exit
的话就会直接退出这个窗口,这就是goto :eof
和exit
区别。
- call的第二种用法,调用一个命令,如:call ping 127.1,这和直接ping 127.1看似是一样的,但还是有区别的。主要用法就是call set,在后面讲延迟环境变量的时候慢慢体会。
- call的第三种用法,调用一个应用程序,call notepad.exe。call可以这么用,但一般在调用应用程序的时候会使用start,很少用call。
- call的第四种用法,调用本批处理中的一个标签,可以用来实现函数。和 直接使用 goto 相比,call 调用完后会回到原位置继续执行。如:
@echo off
call :no1
start notepad.exe
exit
:no1
start calc
ping /n 2 127.1>nul
在这里会先打开计算器,然后打开记事本。在call标签的时候要加上:
。
2、变量声明
SET [variable=[string]]
- 等号两边不要有空格,带了空格会有奇怪的问题
- 变量值包含特殊字符需用双引号
例如:`set "a=1&b=2" - 避免使用系统环境变量同名的自定义变量
path
,date
,errorlevel
等 - 声明多个变量
/a
使用连等把多个变量赋值成数字 set /a x=y=100 逗号分隔把多个变量赋值成数字 set /a x=1,y=2
- 显示所有的变量的值
@echo off set pause
- 打印某个变量的值
在批处理中我们要引用这个变量就把var
变量名用两个%
(百分号)扩起来,如%var%
@echo off set var=123 echo %var% pause
3、注释
bat 的注释和常用语言的注释大不相同。rem
、::
代表单行注释,使用 goto
语法来实现多行注释。"::"其实就是不规范的标签名。
@echo off
rem 这是注释
:: 这是注释
goto :comment1
这是多行注释
这是多行注释
这是多行注释
:comment1
echo test comment .. hengyumo
pause
4、条件判断
if命令有以下5钟用法
if "字符串1"=="字符串2" command 语句
判断两个字符串是否相等if 数值1 equ 数值2 command 语句
判断两个数值是否相等if exist filename command 语句
判断判断驱动器,文件或文件夹是否存在if defined 变量 command 语句
判断变量是否已经定义if errorlevel 数值 command 语句
判断上个命令的返回值
示例
判断文件是否存在if exist d:\test.txt (echo D盘下有test.txt存在) else (echo D盘下不存在test.txt)
判断字符串是否相等if "abc"=="xyz" (echo 字符串abc等于字符串xyz) else (echo 字符串abc不等于字符串xyz)
判断两个数值是否相等if 1 equ 2 (echo 1等于2) else (echo 1不等于2)
判断变量是否已经定义if defined str (echo 变量str已经被赋值,其值为%str%) else (echo 变量str的值为空)
判断字符串是否相等的时候,if会区分大小写,比如,单纯的if语句会认为字符串abc
和字符串Abc
不相同,若不想区分大小写,则需要添 /i
加开关,使用 if /i "字符串1"=="字符串2"
的格式;
另外,等于符号是连续的”==“而非单独的”="。
判断两个数值之间的大小关系,除了等于用equ之外,还有其他的关系符号,所有适用于if语句的关系符号见下表 ,和常见的 lt、gt并不相同。
中文含义 | 关系符 | 英文解释 |
---|---|---|
等于 | equ | equal |
大于 | gtr | greater than |
大于或等于 | geq | greater than or equal |
小于 | lss | less than |
小于或等于 | leq | less than or equal |
不等于 | neq | no equal |
else if
@echo off
set /p num1=请第一个输入数字:
set /p num2=请第二个输入数字:
if "%num1%" gtr "%num2%" (
echo 第一个数字大
) ELSE if "%num1%" EQU "%num2%" (
echo 一样大
) ELSE (
echo 第二个数字大
)
pause>nul
errorlevel 判断执行结果
批处理中的返回值一般表示了上个命令的执行结果(成功/失败/等)
每个命令执行完毕后返回值都会做相应的更改,一般返回值为0表示成功,1表示失败
@echo off
echo;>>%systemroot%\test.txt
if errorlevel 0 ( echo 写入成功! ) else echo 写入失败
pause>nul
利用 choice 命令判断返回值。
@echo off
choice /C ABC /T 10 /D A /M "plese choice a/b/c"
if errorlevel 3 echo You choose the C
if errorlevel 2 echo You choose the B
if errorlevel 1 echo You choose the A
pause>nul
5、循环
6、函数
通过标签和 goto:eof配合来定义函数,通过call来进行函数调用。
一个简单的函数,打印两个数的和,参数是3和5、2和2,打印的结果是8、4。其中函数中的 %1代表传入的第一个参数,函数的 %2代表第二个参数,以此类推,最多是到 %9。函数无法直接返回值,只能通过修改全局变量的方式返回值。传递的参数,如果是变量,则需要通过%val%先解引用。不建议用函数封装过于复杂的功能。如果确实有这样的需要,可以用别的语言实现,然后再使用bat调用。尽可能保证 bat 脚本足够简单,流程一目了然。
当参数以引号开头时,%~1会自动将引号删除,而 %1不会。
@echo off
call:add 3,5
set /a x=y=2
call:add %x% %y%
pause
:add
set /a sum=%1+%2
echo %sum%
goto:eof
7、特殊命令
1、set /p 读取输入
@echo off
set /p input=请输入一个字符串:
echo %input%
pause
读取文件的第一行内容
C:\>echo BatHome>1.txt
C:\>set /p input=<"1.txt"
C:\>echo %input%
BatHome
批处理光标回退(非cls清屏)动画效果演示
@echo off
echo bbs.bathome.net
set /p =光标回退(非cls清屏)动画效果演示:<nul
for /l %%i in (1,1,10) do (
set /p =%%i<nul
set /p =<nul
ping -n 2 127.1 >nul
)
echo,
pause
2、使用 set /a 命令进行数学运算
数字精确度限为 32 位。不支持直接计算浮点数。
C:\>set x=1
C:\>set y=2
C:\>set /a n=%x%+%y%
3
C:\>set /a n=x+y
3
取余
C:\>set /a n=3%2
1
逻辑运算的特殊字符需要使用双引号
C:\>set /a "m=1<<10"
1024
C:\>set /a n=1"<<"10
1024
版权声明
本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途
评论区#
还没有评论哦,期待您的评论!
引用发言