bat 批示处理详解-1
一: bat 文件理解
1> 理解
windows下BAT批处理的工作原理就是一次处理多条DOS命令,其效果和在DOS下依次执行各条命令相同;BAT文件其实就是文本文件,用任意文本编辑器均可打开。
windows下借助bat文件,相对于–Linux下借助shell脚本可以完成很多操作步骤繁琐但操作次序相同,且整个过程需要重复执行多次的情况
2> 批处理运行命令机制
批处理读取命令时是按行读取,在处理之前要完成必要的预处理工作;在其中包含该命令中的变量赋值;
应用场景:'交换'两个变量的值,但是'不使用临时'变量
set var1=abc
set var2=123
set var1=%var2%& set var2=%var1%
原因:先做'预处理'-->'变量值'替换
错误语法:
set a=123 & echo %a% # 命令是按行读取,此处还未对a做处理,所以此处是有错误的
为了解决这类问题,设置变量延迟
作用:在读取完成一行语句后,不立即对该行的变量进行赋值,而是会对某单条语句执行后,在进行赋值,这也是延迟变量赋值作用;
setlocal enabledelayedexpansion
启动了变量延迟效果:告知'批处理'动态'感知'变化-->即'先不给'该行变量赋值,而是在'运行过程中'给变量'赋值' -->'顺序'
解读:%variable%‘不能感知’变量的’变化’
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,3,10) do (
set a=%%i # 此处不能使用 %a%
echo !a!
)
pause
二: dos命令整理
1> dos命令 help /commadn /? -查询帮助
cmd界面直接输入---》help 如下命令
常用命令 | 含义 |
---|---|
CD | 显示当前目录的名称或将其更改。 |
CHDIR | 显示当前目录的名称或将其更改。 |
BREAK | 设置或清除扩展式 CTRL+C 检查。 |
DATE | 显示或设置日期 |
DIR | 显示一个目录中的文件和子目录 |
ECHO | 显示消息,或将命令回显打开或关闭 |
EXIT | 退出 CMD.EXE 程序(命令解释程序) |
FIND | 在一个或多个文件中搜索一个文本字符串。 |
FINDSTR | 在多个文件中搜索字符串。 |
HELP | 提供 Windows 命令的帮助信息。 |
PATH | 为可执行文件显示或设置搜索路径。 |
PAUSE | 暂停批处理文件的处理并显示消息。 |
ENDLOCAL | 结束批文件中环境更改的本地化。 |
TIME | 显示或设置系统时间。 |
CLS | 清除屏幕 |
SYSTEMINFO | 显示计算机的特定属性和配置。 |
COLOR | 设置默认控制台前景和背景颜色。 |
文件或目录命令 | 含义 |
---|---|
COPY | 将至少一个文件复制到另一个位置。 |
MD | 创建一个目录。 |
RD | 删除目录。 |
MKDIR | 创建一个目录。 |
MKLINK | 创建符号链接和硬链接 |
MODE | 配置系统设备。 |
MORE | 逐屏显示输出。 |
MOVE | 将一个或多个文件从一个目录移动到另一个目录。 |
COMP | 比较两个或两套文件的内容 |
OPENFILES | 显示远程用户为了文件共享而打开的文件。 |
DEL | 删除至少一个文件。 |
ERASE | 删除一个或多个文件。 |
FC | 比较两个文件或两个文件集并显示 它们之间的不同。 |
RECOVER | 从损坏的或有缺陷的磁盘中恢复可读信息。 |
REN | 重命名文件。 |
RENAME | 重命名文件。 |
REPLACE | 替换文件。 |
RMDIR | 删除目录。 |
ROBOCOPY | 复制文件和目录树的高级实用工具 |
dos命令语句 | 含义 |
---|---|
CALL | 从另一个批处理程序调用这一个。 |
IF | 在批处理程序中执行有条件的处理操作。 |
SET | 显示、设置或删除 Windows 环境变量。 |
SORT | 对输入排序。 |
FOR | 为一组文件中的每个文件运行一个指定的命令。 |
GOTO | 将 Windows 命令解释程序定向到批处理程序中某个带标签的行。 |
SETLOCAL | 开始本地化批处理文件中的环境更改。 |
START | 启动单独的窗口以运行指定的程序或命令。 |
TASKLIST | 显示包括服务在内的所有当前运行的任务。 |
TASKKILL | 中止或停止正在运行的进程或应用程序。 |
TYPE | 显示文本文件的内容。 |
打印一个文本文件。 |
其他命令 | 含义 |
---|---|
TITLE | 设置 CMD.EXE 会话的窗口标题。 |
TREE | 以图形方式显示驱动程序或路径的目录结构。 |
VER | 显示 Windows 的版本。 |
CHCP | 显示或设置活动代码页数。 |
CHKDSK | 检查磁盘并显示状态报告。 |
ASSOC | 显示或修改文件扩展名关联。 |
CHKNTFS | 显示或修改启动时间磁盘检查。 |
ATTRIB | 显示或更改文件属性。 |
CMD | 打开另一个 Windows 命令解释程序窗口。 |
BCDEDIT | 设置启动数据库中的属性以控制启动加载。 |
CACLS | 显示或修改文件的访问控制列表(ACL)。 |
COMPACT | 显示或更改 NTFS 分区上文件的压缩。 |
CONVERT | 将 FAT 卷转换成 NTFS。你不能转换当前驱动器。 |
DISKPART | 显示或配置磁盘分区属性。 |
DOSKEY | 编辑命令行、撤回 Windows 命令并创建宏。 |
DRIVERQUERY | 显示当前设备驱动程序状态和属性。 |
FSUTIL | 显示或配置文件系统属性。 |
FTYPE | 显示或修改在文件扩展名关联中使用的文件类型。 |
FORMAT | 格式化磁盘,以便用于 Windows。 |
GPRESULT | 显示计算机或用户的组策略信息。 |
GRAFTABL | 使 Windows 在图形模式下显示扩展字符集。 |
LABEL | 创建、更改或删除磁盘的卷标。 |
ICACLS | 显示、修改、备份或还原文件和目录的 ACL。 |
POPD | 还原通过 PUSHD 保存的当前目录的上一个值。 |
SCHTASKS | 安排在一台计算机上运行命令和程序。 |
SHIFT | 调整批处理文件中可替换参数的位置。 |
SHUTDOWN | 允许通过本地或远程方式正确关闭计算机。 |
PROMPT | 更改 Windows 命令提示。 |
PUSHD | 保存当前目录,然后对其进行更改。 |
SC | 显示或配置服务(后台进程)。 |
SUBST | 将路径与驱动器号关联。 |
VERIFY | 告诉 Windows 是否进行验证,以确保文件正确写入磁盘。 |
VOL | 显示磁盘卷标和序列号。 |
XCOPY | 复制文件和目录树。 |
WMIC | 在交互式命令 shell 中显示 WMI 信息。 |
REM | 记录批处理文件或 CONFIG.SYS 中的注释(批注)。 |
2> dos命令使用查询
dos_command -help(-h)
1. 传参命令–COLOR -H
设置默认的控制台前景和背景颜色。
COLOR [attr]
attr 指定控制台输出的颜色属性。
颜色属性由两个十六进制数字指定 -- 第一个
对应于背景,第二个对应于前景。每个数字
可以为以下任何值:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
如果没有给定任何参数,此命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台
窗口、/T 命令行开关或 DefaultColor 注册表
值。
如果尝试使用相同的
前景和背景颜色来执行
COLOR 命令,COLOR 命令会将 ERRORLEVEL 设置为 1。
示例: "COLOR fc" 在亮白色上产生淡红色
DEMO
COLOR 72# 背景7 = 白色, 字体 2 = 绿色
2. 查询指令 SYSTEMINFO
C:\Users\CHH_PC>SYSTEMINFO
主机名: DESKTOP-T164P4E
OS 名称: Microsoft Windows 10 专业版
OS 版本: 10.0.19044 暂缺 Build 19044
OS 制造商: Microsoft Corporation
OS 配置: 独立工作站
OS 构建类型: Multiprocessor Free
注册的所有人: CHH_PC
注册的组织: 暂缺
产品 ID: 00331-20020-00000-AA583
初始安装日期: 2022/4/15, 20:25:43
系统启动时间: 2022/6/25, 0:02:32
系统制造商: Dell Inc.
系统型号: Inspiron 7472
系统类型: x64-based PC
处理器: 安装了 1 个处理器。
[01]: Intel64 Family 6 Model 142 Stepping 10 GenuineIntel ~1600 Mhz
3. DOS窗口的编码格式
936 是微软为中国区设置的编码格式,当然,我们也可以对编码格式进行修改
chcp 编码格式代码
#这种只是临时的进行修改当前文件的编码格式,当这个DOS窗口关闭后又将恢复到原来的编码格式
代码 | 编码格式 |
---|---|
950 | 繁体中文 |
65001 | UTF-8 |
936 | 简体中文默认的GBK |
437 | MS-DOS 美国英语 |
1253 | 希腊语 |
1258 | 越南语 |
1256 | 阿拉伯语 |
三: bat 语法介绍
1> 辅助命令
1. 符号&转义&组合
符号-“”、%、:, ; () !
:冒号
** : : 开头为单个冒号;被视作标号,而直接忽略后面所有的内容;
有效标号: 冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别;
无效标号:冒号后紧跟一个非字母数字开头的字符串,goto语句无法识别;可以起到注释左右;即作为习惯 ** :: ** 常被用做注释符号,其实后面一个 ** : ** 可以替换成任意字符也能起到注释效果,如::+** 、 :* …
REM:‘注释命令’,一般用来给程序’加上注解’,该命令后的内容’不被执行, 但’能回显;
%注释内容% :用于行内注释,极少用,慎用;
注释 | 区别 |
---|---|
:: | 不可回显,被视作无效命令 |
REM或rem | 不被执行,能回显,可用于config.sys文件 |
“”: 双引号: 允许在字符串中出现空格;
%:百分号
涉及:%、%%vaeiable-->"for循环中(接受变量)"、%variable%-->"echo中引用变量"
备注:!variable! -->是对'%variable%'的增强
符号 | 功能 |
---|---|
% | 批处理变量引导符号 |
%var% | 引用变量 |
%0、—%9 | 0为批量本身,1-9为传参;例如:copy %0 /sys/ |
行内注释 | %注释内容%-但不能出现重定向等符号 |
, 逗号
逗号相当于空格,在某些情况下“,”可以用来当做空格使
dir,c:\ 或者传参 12,23
; 分号
分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
dir c:\;d:\;e:\;z:\ 等同于
dir c:\
dir d:\ …
() 括号
小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。
在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用;
demo
命令:echo 1 echo 2 & echo 3
可以写成:
(
echo 1
echo 2
echo 3
)
! 感叹号
在变量延迟问题中,用来表示变量,即%var%应该表示为!var!
转义\换行
符号 | 功能 |
---|---|
^开头 | 对特殊符号’<、>、&'的前导字符,在命令中他将’以上3个符号’的’特殊’功能去掉,仅仅只把他们’当成符号’而’不使用’他们的特殊意义 |
^末尾 | 在语句末尾起到换行作用 |
组合
&、&&、||:把多条命令组合起来成一条命令执行
语法: 第一条命令 & 第二条命令 & 第三条命令 [&…]
符号 | 功能 |
---|---|
& | 把多条命令顺序执行,中间有语句错误,不影响下一句语句执行,无条件执行&符号后面的命令 |
&& | 当&&前面的命令成功执行时,执行&&后面的命令,否则不执行 |
双管道符 | 当前面的命令失败时,执行符号后面的命令,否则不执行 |
优先级别
'|' 大于 '>、>>' 大于 '||、&&'
# 管道命令优先高于重定向命令,重定向命令优先高于组合命令;
2. echo 回显
备注: echo 后面的字符串’不需要加’双引号–>否则也会’写入文件’中 -->区别Linux
关闭回显:是指’运行批处理文件’时,‘不显示’文件里的’每条命令’,只显示’运行结果’;
@echo off #从’本行开始’关闭回显 ----一般批处理’第一行’都是这个
C:\Users\CHH_PC>echo /?
显示消息,或者启用或关闭命令回显。
ECHO [ON | OFF]
ECHO [message]
若要显示当前回显设置,请键入不带参数的 ECHO。
==========================================
echo off :显示执行的路径,不显示执行命令,直接显示内容
echo on:显示执行的路径,显示执行命令并显示内容,
@echo off : 不显示执行的路径,不显示执行命令,直接显示内容
用法:
A:echo 配合@ \off\on 关闭打开回显
B:echo 后面跟空格加字符,回显字符串信息作用;
C: echo紧跟 .|,管道符后可以跟命令用来回显;
C:\Users\CHH_PC>echo.|time
当前时间: 22:35:19.42
输入新时间:
bat内容
@echo off
echo.|SYSTEMINFO
pause
D: echo 生成文件并写入信息;
echo a test file. >1.txt # 此处生成文件并写入内容,且a test file. 后有个空格;
echo a test file.>1.txt# 此处生成文件并写入内容,且a test file. 后无空格;因为 **file.>1** ,连接处无空格;
echo a test file.>>1.txt# 此处生成文件并写入内容或者对文件内容后面追加内容;
E:echo 使电脑发出声音用来提示;
声音 | 命令 |
---|---|
蜂鸣 | echo pause>nul |
3. pause
运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue…的提示,等待用户按任意键后继续;
4. 句柄
句柄:代码中智能指针;
内容 | 含义 |
---|---|
‘>&’ | 将一个句柄内容输出写入到另一个句柄输入 |
'<& ’ | 将一个句柄读取输入写入到另一个句柄输出中 |
常用句柄 | 含义 |
---|---|
总述 | 常用句柄定义0,1,2,其中3-9未定;stdin可以被<重定向,stdout可以被 > ,>> 重定向; |
1>nul | 禁止输出正确信息;1,2代表某数据流入流出的地址, |
2>nul | 禁止输出错误信息;1,2代表某数据流入流出的地址, |
0 | 标准输入stdin,键盘输入 |
1 | 标准输出stdout,输出到命令提示符窗口conole |
2 | 标准错误输出stderr,输出到命令提示符窗口conole |
2> 文件处理命令
1. 文件处理
ren 重命名
ren 1.png 2.png # first_file target_file
move 移动
move file_pat target_path
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 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。
2. 文件调用及区别call&start& goto
直接调用,在文本中直接调用文件名;例如:@echo off 2.png ,可以直接打开图片
call 调用另一个批处理文件或可执行程序
语法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数: [Drive:][Path] FileName 指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。
start 调用;调用外部程序,所有的 DOS命令 和 命令行程序 都可以由 start命令 来调用
常用参数:
MIN :开始时窗口最小化
SEPARATE :在分开的空间内开始 16 位 Windows 程序
HIGH: 在 HIGH 优先级类别开始应用程序
REALTIME :在 REALTIME 优先级类别开始应用程序
WAIT :启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
================================
Sample:start /MIN test2.bat arg1 arg2 (调用同目录下的 test2.bat,且输入2个参数给他,且本窗口最小化)
goto label: —:label
区别:其中主要是直接调用与call区别,其他只是跳转
命令 | 区别 |
---|---|
直接调用 | 可以调用别的批处理文件,但是这样调用的批处理文件执行结束后不会回到原来的批处理文件 |
call | 调用另一个批处理文件或可执行程序,并不终止原来的文件;主要来进行批处理的内部调用,当然也可以调用可执行程序, |
start | 可以调用别的批处理文件 &文件&可执行文件;执行结束后不会回到原来的批处理文件;而start 不能进行内部调用,但是其可以执行几乎所有的外部程序。call 是在当前窗体进行调用一个子进程,变量可以互通,但是start 调用外部程序是相当于是新开一个进程。call 可以将参数传入子进程,子进程也可以将值返回,但是start 只能进行传参,但是不能返回参数或者变量 |
goto | 其后可以直接调用,但主要运用在循环中的跳转;goto label: 跳转到指定标签行,然后从" : label " 的下一行开始处理命令 ,goto 语句经常和 if 连起来用label 的名字可以随意取,goto 是根据 " : " 找到该标签的,不要忘记了 冒号。 |
demo
@echo off
echo goto
goto test1:
:test1 # 直接跳转在这里,可以放在循环中跳转
start test1.bat
pause
3> 执行语句命令
1. if else& if& if exist
if 表示将判断是否符合规定的条件,从而决定执行不同的命令;
语法:
DOS命令里并没有 != 这种写法,但是提供了 not 关键词,也是条件取反的意思
if 条件(成立时执行的命令) else (不成立时执行的命令)
::执行的语句建议都写在 "()" 里。
当else换行时候;if 语句的末尾使用 " ^ " 符号将语句进行连接,否则会报错
if 条件(成立时执行的命令)^
else (不成立时执行的命令)
demo
@echo off
if exist test1.bat (test1.bat)^
else (echo "the file not exist")
::当存在second.bat 时就执行这个批处理文件 否则打印"the file not exist"
pause
这里是可执行文件在同级目录下,可以添加相对路径也可以放对决路径;
test1.bat 等文件可以被执行,2.png 像图片之类的可以被直接打开;
如果是多个条件,建议适当使用括号把各条件包起来;
if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else (echo comment3 )
2. if errorlevel number
执行返回值 ,返回的是数字;一般DOS程序会在执行结束后返回一个数字来代表程序运行的结果,称为错误码 errorlevel 或者返回码,有点返回值那味了是不
常见的返回码为 : 0 1
errorlevel 0 成功 errorlevel 1 失败
@echo off
if exist 2.png (2.png)^
else (echo "the file not exist")
::当存在second.bat 时就执行这个批处理文件 否则打印"the file not exist"
if errorlevel 0 (echo operate sucess) else (echo not sucess)
pause
=====================
operate sucess
请按任意键继续. . .
3. for 循环
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令;
基本命令:
FOR %%variable IN (set) DO command [command-parameters]
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令
参数 | 含义 |
---|---|
%%variable | 指定一个单一字母可替换的参数。 |
(set) | 指定一个或一组文件。可以使用通配符。 |
command | 指定对每个文件执行的命令。 |
command-parameters | 为特定命令指定参数或命令行开关。 |
参数: FOR有4个参数 /d /l /r /f
参数 | 含义 |
---|---|
/l | 含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制 |
/d | 表示仅为目录 , 它只能显示当前目录下的目录名字;如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配 |
/r | /R参数之后还可带盘符及路径; |
/f | 含开关/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等 |
/L
命令:
FOR /L %%variable IN (start,step,end) DO command
其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数
for /L %%i in (0,5,100) do (echo %%i& md %%i& mkdir %%i\test)
==============================
循环从0,递增5,直至到达100;同时显示数字,新建文件夹并且在文件夹下新建test文件
求和
@echo off
set /a sum=0
for /l %%i in (1,1,100) do set /a sum=sum+%%i
echo %sum%
pause
================================
5050
请按任意键继续. . .
/d
命令:
FOR /D %variable IN (set) DO command [command-parameters]
@echo off
echo %cd% "current directory path"
d:
for /D %%a in (*A*) do echo %%a >> %~dp0\wordin_dirname.txt
pause
如果这里不切换到,D盘的话,/d只闲显示脚本路径下的文件下信息,写到txt文件中;
/r
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
/r 后无路径:对脚本所在路径遍历
/r 后跟路径:对跟的指定路径遍历
含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹
@echo off
echo %cd% "current directory path"
path=d:
for /r %path% %%i in (*.txt) do echo %%i >> %~dp0\file_endswith.txt
pause
==============================
指定path 下的 以.txt 结尾的文件 追加写在 脚本路径下file_endswith.txt 文件中;
D:\FilesPath3.txt
D:\360\360Safe\deepscan\QVM\model_360nb\update.txt
D:\360RecycleBin\!此文件夹为使用360清理后的垃圾备份文件.txt
D:\360RecycleBin\1\1738c7987314ed4166ffc1383a0e4f59.txt
D:\360RecycleBin\1\f006782cc4d3ebd69dda70eef55d39d0.txt
D:\360RecycleBin\104\7119dfac6242b7776fdd80dd7e0cd986.txt
........
/F
命令:
FOR /F [“options”] %%variable IN (set) DO command
其中,set为(“string”、‘command’、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。一般情况下,使用较多的是skip、tokens、delims三个选项;
选项 | 含义 |
---|---|
skip=n | 从文本开始忽略n行 |
delims | 指定定界符 |
tokens | 提取列。 通俗讲,共同提取每一行的第m小节的内容。因此,可以用该命令来指定提取文本信息。 |
tokens 讲解
tokens组合 | 含义 |
---|---|
tokens= | 提取全部。 |
tokens=m | 提取第m列。 |
tokens=m,n | 提取第m列和第n列。 |
tokens=m-n | 提取第m列至第n列。 |
tokens=* | 删除每行前面的空格。忽略行首的所有空格。 |
tokens=m* | 提取第m列以后的所有字符,星号表示剩余的字符。 |
tokens=m,* | 提取第m列以后的所有字符,星号表示剩余的字符。 |
输出变量的个数由定义了的tokens决定。
demo
对日志符号替换
@echo off
Date
For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo %%j year %%k month %%l day
pause
===============================
#把1到3列 "/” 替换成 对应的
当前日期: 2022/07/17 周日
输入新日期: (年月日)
2022 year 07 month 17 day
请按任意键继续. . .
显示文档信息
for /f "delims=" %%a in (FilesPath3.txt) do echo.%%a # 显示文档内所有行信息;
for /f "delims= skip=12" %%a in (FilesPath3.txt) do echo.%%a# 从第12行开始显示
4. continue 和 break
利用 goto 实现程序中常用的 continue 和 break 命令
ontinue: 在 for 循环的最后一行写上一个标签,跳转到这位置即可
break: 在 for 循环的外面的下一句写上一个标签,跳转到这位置即可
demo
for /F ["options"] %variable IN (command) DO (
... do command ...
if ... goto continue
if ... goto break
... do command ...
:continue
)
:break
4> 其他相关常用命令
1. 路径相关
功能 | 命令 | 区别 |
---|---|---|
当前盘符 | %~d0 | |
当前路径 | %cd% | 表示执行命令时所在的目录;可以改变的,因为它表示的是当前目录,如果在批处理中使用了cd命令就会改变他的值 |
当前执行命令行 | %0 | |
当前bat文件路径 | %~dp0 | 表示批处理文件所在的目录;是在执行某个批处理结束之前是不会改变的,因为代表的是脚本文件在磁盘的位置 |
当前bat文件短路径 | %~dp0 |
demo
echo %~d0
echo %cd%
echo %0
echo %~dp0
echo %~dp0
cd /d %~dp0
pause
===================
C: 当前盘符
C:\Users\CHH_PC\Desktop\test 当前路径
"C:\Users\CHH_PC\Desktop\test\test.bat" 当前执行命令行
C:\Users\CHH_PC\Desktop\test\ 当前bat文件路径
C:\Users\CHH_PC\Desktop\test\ 当前bat文件短路径
请按任意键继续.
查询上级目录可以 cd 再看 %~dp0 信息,这些都会与dir 等命令配合使用;
@echo off
cd /d %~dp0
::显示当前路径
echo %cd%
cd ..
::显示上级目录路径
echo %cd%
pause
2. 传参相关
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。
变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用 %1 到 %9 顺序表示。
Sample:
call test2.bat “hello” “haha” (执行同目录下的“test2.bat”文件,并输入两个参数)
在“test2.bat”文件里写:
echo %1 (打印: “hello”)
echo %2 (打印: “haha”)
echo %0 (打印: test2.bat)
echo %19 (打印: "hello"9)
3,字符串处理
A: 分割
%源字符串:~起始值,截取长度% (起始值从0开始;截取长度是可选的,如果省略逗号和截取长度,将会从起始值截取到结尾;
截取长度如果是负数,表示截取到倒数第几个。)
“%time%” 显示如:“11:04:23.03” (完整的时间"hh:mm:ss.tt")
“%time:~0,5%” 显示"hh:mm"(即"11:04"),其中0表示从右向左移位操作的个数,5表示从左向右移位操作的个数
“%time:~0,8%” 显示标准时间格式"hh:mm:ss"(即"11:04:23",前8个字符串)
"%time:~3,-3%“显示"mm:ss”(即从第4个开始,截去最后3个的字符串)
“%time:~3%” 显示"04:23.03"(即去掉前4个字符串)
“%time:~-3%” 显示".tt"(即最后3个字符串)
上面的字串分割格式,也可以用于其它地方,如目录路径:“%cd:~0,10%”
@echo off
echo %cd%
echo %cd:~0,5%
echo %cd:~0,8%
echo %cd:~3,-3%
echo %cd:~3%
echo %cd:~-3%
pause
=============
C:\Users\CHH_PC\Desktop\test
C:\Us
C:\Users
Users\CHH_PC\Desktop\t
Users\CHH_PC\Desktop\test
est
请按任意键继续. . .
B: 替换
@echo off
set a="C:\Users\CHH_PC\Desktop\test"
set path1=%a:\=&%
echo %path1%
pause
==================== # 替换\ 为& 符号
"C:&Users&CHH_PC&Desktop&test"
请按任意键继续. . .
C:拼接
由于没有直接的字符串合并函数,只能用笨方法
@echo off
set a=C:\Userst
set b=\CHH_PC\
set c=Desktop\
set d=test
set str1=%a%%b%%c%%d%
echo %str1%
pause
============
C:\Userst\CHH_PC\Desktop\test
请按任意键继续. . .
D: 计算长度
没有现成的函数。如下程序利用 goto形成循环,不断将字符串截短1,并记录截短的次数,到字符串变成空时的次数即长度;
@echo off
setlocal enabledelayedexpansion
if exist report.txt del report.txt
set line=0
for /f "tokens=* delims=" %%a in (new.txt) do (
set var=%%a
set /a line+=1
set num=0
call :loop
echo !line! >> report.txt
)
:loop
if not "!var!"=="" (
set /a num+=1
set var=!var:~1!
goto loop
) else (
goto :eof
)
pause
=======================
1
.
.
.
15
E: 截取字符,传递参数
@echo off
set ifo=abcdefghijklmnopqrstuvwxyz0123456789
echo %ifo%
echo ==============================
echo first 5 char
echo %ifo:~0,5%
echo lastest 5 char
echo %ifo:~-5%
echo from first to lastest 5 char
echo %ifo:~0,-5%
echo from fourth ,long 5
echo %ifo:~3,5%
echo from start at lastest 14 char ,long 5
echo %ifo:~-14,5%
pause
==========================
abcdefghijklmnopqrstuvwxyz0123456789
==============================
first 5 char
abcde
lastest 5 char
56789
from first to lastest 5 char
abcdefghijklmnopqrstuvwxyz01234
from fourth ,long 5
defgh
from start at lastest 14 char ,long 5
wxyz0
请按任意键继续. . .
4. set 命令
A: set 赋值
等号两边不要有空格
变量值包含特殊字符需用双引号
避免使用系统环境变量同名的自定义变量;如:path , date , errorlevel 等
语法可行但不推荐使用,set /a x=y=100;set /a x=1,y=2
@echo off
set str=%cd%
echo %str%
set "str1=Bat&Home"
echo " %str1%"
pause
===================
C:\Users\CHH_PC\Desktop\test
" Bat&Home"
请按任意键继续. . .
B: set /p 读取输入
交互获取用户输入
读取文件的内容
@echo off
set /p input=请输入一个字符串:
echo %input%
pause
============
@echo off
set /p input=<"new.txt"
echo %input%
pause
输出是否回车
@echo off
for %%i in (aas aa zx aasc) do (
set /p =%%i
)
pause
================
aas
aa
zx
aasc
请按任意键继续. . .
@echo off
for %%i in (aas aa zx aasc) do (
set /p =%%i<nul
)
pause
================
aasaazxaasc请按任意键继续. .
C: set /a 数学运算
等号右侧的变量可以省略百分号
@echo off
set x=99
set y=100
set /a n=%x%+%y% # 等价set /a n=x+y
echo %n%
pause
======================
199
请按任意键继续. .
八进制和十六进制转换成十进制
@echo off
set /a m=012
set /a n=0xA
echo %m% %n%
pause
==============
10 10
请按任意键继续. . .
BAT文件里面进行“取余”操作的时候需要使用两个百分号
@echo off
set /a m=10%%3
echo %m%
pause
=================
1
请按任意键继续. . .
逻辑运算的特殊字符需要使用双引号
@echo off
set /a "m=1<<10"
set /a n=1"<<"10
echo %m% %n%
pause
不支持直接计算超大数(例如磁盘空间的计算)
不支持直接计算浮点数
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
表达 | 含义 |
---|---|
() | 分组 |
! ~ - | 一元运算符 |
“* / %” | 算数运算符 |
“+ -” | 算数运算符 |
<< >> | 二进制逻辑移位 |
- | 二进制按位“与” |
^ | 二进制按位“异” |
I | 二进制按位“或” |
= *= /= %= += -= | 算数赋值 |
= ^= | = <<= >>= |
, | 表达式分隔符 |
D: set 字符截取& 替换
set str=字符串 ,其方法和上面截取字符,传递参数 一致
E: set 赋值变量
F: set 字符开头变量
直接执行 set 命令可以显示系统环境变量
命令 set xxx 可以显示所有以 xxx 开头的变量
显示结果按照变量名进行排序
@echo off
set xxx1=A
set xxx3=C
set xxx2=B
set xxx
echo xxx
pause
==================
xxx1=A
xxx2=B
xxx3=C
xxx
请按任意键继续. .
@echo off
for %%i in (a b c d e f g ) do (
set #%%i=%%i
)
for /f "tokens=2 delims==" %%i in ('set #') do (
echo %%i
)
pause
======================
a
b
c
d
e
f
g
请按任意键继续. .
5. ping 命令
用法: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
[-r count] [-s count] [[-j host-list] | [-k host-list]]
[-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]
[-4] [-6] target_name
选项:
-t Ping 指定的主机,直到停止。
若要查看统计信息并继续操作,请键入 Ctrl+Break;
若要停止,请键入 Ctrl+C。
-a 将地址解析为主机名。
-n count 要发送的回显请求数。
-l size 发送缓冲区大小。
-f 在数据包中设置“不分段”标记(仅适用于 IPv4)。
-i TTL 生存时间。
-v TOS 服务类型(仅适用于 IPv4。该设置已被弃用,
对 IP 标头中的服务类型字段没有任何
影响)。
-r count 记录计数跃点的路由(仅适用于 IPv4)。
-s count 计数跃点的时间戳(仅适用于 IPv4)。
-j host-list 与主机列表一起使用的松散源路由(仅适用于 IPv4)。
-k host-list 与主机列表一起使用的严格源路由(仅适用于 IPv4)。
-w timeout 等待每次回复的超时时间(毫秒)。
-R 同样使用路由标头测试反向路由(仅适用于 IPv6)。
根据 RFC 5095,已弃用此路由标头。
如果使用此标头,某些系统可能丢弃
回显请求。
-S srcaddr 要使用的源地址。
-c compartment 路由隔离舱标识符。
-p Ping Hyper-V 网络虚拟化提供程序地址。
-4 强制使用 IPv4。
-6 强制使用 IPv6。
demo
ping 192.168.16.108 -4 -t
=========================
来自 192.168.16.108 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.16.108 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.16.108 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.16.108 的回复: 字节=32 时间<1ms TTL=64
192.168.16.108 的 Ping 统计信息:
数据包: 已发送 = 6,已接收 = 6,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
Control-C
6. shutdown命令
用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f]
[/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]]
===============================
/? 显示帮助。这与不键入任何选项是一样的。
/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-315360000 (10 年),默认值为
如果超时期限大于 0,则 /f 参数为
/f 参数。
/c "comment" 注释重启或关闭的原因。
最多允许 512 个字符。
/f 强制关闭正在运行的应用程序而不事先警告用
当大于 0 的值为
,隐含 /f 参数 则默示为 /f 参数。
/d [p|u:]xx:yy 提供重新启动或关闭的原因。
p 指示重启或关闭是计划内的。
u 指示原因是用户定义的。
如果未指定 p 和 u,则
启动或关闭 是计划外的。
xx 是主要原因编号(小于 256 的正整数)。
yy 是次要原因编号(小于 65536 的正整数)。
7. choice 命令
choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的 errorlevel,
然后配合 if errorlevel 选择运行不同的命令。
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。
使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……
Sample: choice /c:dme defrag,mem,end
将显示: defrag,mem,end[D,M,E]?
Sample:
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (应先判断数值最高的错误码)
if errorlevel 2 goto mem
if errotlevel 1 goto end
四:题外话
1> call 文件的相互传参
test.bat
@echo off
setlocal enabledelayedexpansion
set x=%1%
set y=%2%
set /a M=%x%+%y%
echo %M%
echo call test1.bat %M%
call test1.bat %M%
pause
test1.bat
@echo off
set input=%1%
echo it is test running number %input%!
pause
输出:
C:\Users\CHH_PC\Desktop\test>test.bat 1,2
3
call test1.bat 3
it is test running number 3
请按任意键继续. . .
请按任意键继续. .
2> setlocal enabledelayedexpansion 含义
设置本地为延迟扩展。其实也就是:延迟变量,全称"延迟环境变量扩展",
在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。
3> bat 批示处理详解-2
https://blog.csdn.net/weixin_42914706/article/details/125961200