批处理
1,注释
rem 后面的为注释
:: 这里的::为注释符
2,暂停
pause 会暂定当前命令行执行
3,切换编码,防止中文乱码
chcp 65001 :这行命令会将命令行窗口的编码切换到UTF-8
4,echo off echo on @echo of
将echo状态设置为off表示关闭其他所有命令(不包括本身这条命令)的回显
将echo状态设置为on,将显示命令行,显示下一条命令本身的回显
@的作用就是关闭紧跟其后的一条命令的回显
注意:
- 当关闭回显时,rem和::后的内容都不会显示。
- 当打开回显时,rem 后的内容会显示出来,然而::后的内容仍然不会显示。
5,变量
格式:set 变量名=变量值
详细:被设定的变量以%变量名%引用
set 显示所有系统环境变量
set c 显示所有c开头的变量(不区分大小写)
::声明变量 set myVariable=value ::引用变量 echo %myVariable% :: 定义数字变量 set /a n=0 rem 定义字符串变量 SET myString=Hello, World! SET myString="Hello, World!" echo %myString% rem 如果变量名包含空格,需要使用引号,如: SET "myString=Hello, World!" :: 定义数组变量 set arr=1 2 3 4 5 6 ::使用set /p命令从用户那里读取输入并将其存储到变量中 set /p myVariable1=Please enter a value: echo %myVariable1% ::删除变量 set /d myVariable
6,运算符
() 分组
! ~ 一元运算符(逻辑非、按位非、取负)
* / % 算数运算符(乘、除得商、除得余数,即取余)
+ - 算数运算符(加、减)
<< >> 逻辑移位(左移一位、右移一位)
& 按位“与”
^ 按位“异”
| 按位“或”
= *= /= %= += -= 赋值
&= ^= |= <<= >>= 赋值
,表达式分隔符(set可一次处理多个表达式)
rem 加减乘除运算 set /a z=10*5 乘法 set /a z=10/5 除法 set /a z=10+5 加法 set /a z=10-5 减法 set /a z=10%%3 取余 echo %z% rem大于、小于等 set /a a=1,b=2 if %a% equ %b% (echo yes) else (echo no) if %a% neq %b% (echo yes) else (echo no) if %a% lss %b% (echo yes) else (echo no) if %a% leq %b% (echo yes) else (echo no) if %a% gtr %b% (echo yes) else (echo no) if %a% geq %b% (echo yes) else (echo no) ::重定向操作 echo "hello world" >>a.txt rem 多名命令运算 ::第一个命令错误不会执行第二个命令 ipconfig && net user ::第一个命令执行成功不会执行第二个命令 ipconfig || net user rem 管道符号 ::第一个命令A的输出当做第二个命令B的输入 dir | find ".txt"
7,if判断
操作符(不区分大小写) | 描述 | 全称 |
---|---|---|
equ | 等于 | equal |
neq | 不等于 | no equal |
lss | 小于 | less than |
leq | 小于等于 | leq less than or equal |
gtr | 大于 | greater than |
geq | 大于等于 | geq greater than or equal |
@echo off set inputValue=23 ::比较表达式和()之间必须有空格 if %inputValue%==23 (echo %inputValue%等于23) if %inputValue% equ 23 (echo %inputValue%等-于23) if %inputValue% gtr 100 ( echo 大于100 ) else if %inputValue% gtr 10 ( echo 大于10 ) else if %inputValue% gtr 0 ( echo 大于0 ) pause
8,for 循环
批处理的for命令主要有4个用法:
for循环
for %I in (sequence) do command
文本处理
for /f %I in (file) do command
对命令执行结果进行处理
for /f %I in ('command1') do command2
路径扩充
for /f %I in (pathset) do command
在cmd窗口或者os.system(shell)时
for %I in (sequence) do command
在bat文件时
for %%I in (sequence) do command
- for、in和do是for语句的关键字,它们三个缺一不可
- sequence是任何序列,可以只有一个元素。元素可以是变量、字符串,元素之间用空格键、tab键、逗号、分号或等号分隔
- sequence必须用()包围,即使只有一个元素
- %%I是形式变量,即使没有在command中被使用,也不能省略
- for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I和%%i会被认为不是同一个变量
- 为了不与批处理中的%0~%9这10个形式变量发生冲突,请不要随意把%%I替换为%%0~%%9中的任意一个
- for语句依次提取(sequence)中的每一个元素,把它的值赋予形式变量I,带到do后的command中参与命令的执行;当执行完一次do后的语句之后,再提取(sequence)中的下一个元素,再执行一次command,如此循环,直到(sequence)中的所有元素都已经被提取完毕,该for语句才宣告执行结束
1.2 示例:字符串序列用法
for %I in (A,B,C) do echo %I
1
结果
A
B
C
1
2
3
2 文本处理功能
2.1 基本命令
批处理的for命令用作文本处理时,写法如下:
在cmd窗口或者os.system(shell)时:
for /f %I in (file) do command
1
在bat文件时:
for /f %%I in (file) do command
1
/f表示读取文件file内容,以行为单位赋给%%I
默认情况下,每行以空格键作为分隔符分割为第1节、第2节。。。默认只读取第1节赋值给%%I
默认情况下,忽略以分号;打头的行
for /f语句有以下可选参数:
"delims= ":设置分隔符,默认为空格
可以多选,比如"delims=,; "表示同时使用逗号、分好、空格作为分隔符,注意代码中有空格
可以为空,此时"delims="到双引号或者下一个参数不能有任何空格,否则会理解为使用空格作为分隔符,比如"delims="或"delims=tokens=1"
"tokens=":每行读取第几节字符,节数从1开始,默认为1
可以多选,用逗号隔开,用-表示区间,如"tokens=1,3,5",如"tokens=1-5,6"
当"tokens="后面指定了多个数字,for /f 语句对这种情况做如下规定: 如果形式变量为%%I,那么,第一个数字指代的内容用第一个形式变量%%I 来接收,第二个数字指代的内容用第二个形式变量%%J来接收,第三个数字指代的内容用第三个形式变量%%K 来接收。其中,形式变量遵循字母的排序,第 N 个形式变量具体是什么符号,由第一个形式变量来决定
"tokens="中可以使用*表示余下全部内容作为一个整体,*的优先级低于数字。比如"tokens=*"表示整行作为第1节,"tokens=1,*"表示除第1节外,剩下全部内容作为第2节
"skip=n":表示跳过第1到第n行,从n+1行开始读取,默认n=0
"eol=":表示忽略以指定字符打头的行,只能指定1个字符,输入多个只有第一个起效。默认为分号
可以为空
多个字符型参数写到一对双引号下,如以下语句和默认结果等效
for /f "delims= tokens=1eol=;"
3 对命令执行结果进行处理
3.1 基本命令
批处理的for命令括号内的内容可以是其他命令,写法如下:
在cmd窗口或者os.system(shell)时:
for /f %I in ('command1') do command2
1
在bat文件时:
for /f %%I in ('command1') do command2
1
'command1'必须加单引号,表示将command1执行的结果视为文本对象进行处理
3.2 示例:结合for和dir语句
for /f %%I in ('dir %CD%\*.* /A-D /B /S /ON') do echo %%I
1
4 路径扩充
4.1 基本命令
当批处理的for命令形式变量%%I是路径、文件名等路径信息时,可快速进行转换,写法如下:
在cmd窗口或者os.system(shell)时:
for /f %I in (*.*) do echo %~nI
1
在bat文件时:
for /f %%I in (*.*) do echo %%~nI
1
路径扩充的具体指令有:
变量%I的扩充 作用
%~fI 将 %I 扩充到一个完全合格的路径名
%~nI 仅将 %I 扩充到一个文件名
%~xI 仅将 %I 扩充到一个文件扩展名
%~nxI 仅将 %I 扩充到一个文件名和扩展名
%~dpI 仅将 %I 扩充到目录,以\结尾
4.1 示例:搜索当前目录和子目录下所有的txt文件,只记录文件名和扩展名
在cmd窗口或者os.system(shell)时:
for /f %I in ('DIR %CD%\*.txt /A-D /B /S /ON') do echo %~nxI>>log.txt
1
在bat文件时:
for /f %%I in ('DIR %CD%\*.txt /A-D /B /S /ON') do echo %%~nxI>>log.txt
1
结果:
1.txt
2.txt
1
2
5 兼容参数usebacq
5.1 路径兼容
在批处理命令for /f %I in (file) do command中,文件路径不需要引号。但是如果文件路径或者文件名存在空格、&等特殊符号,便无法识别,此时使用"usebacq"参数后,文件名可以使用双引号围起来
错误:
for /f %I in (a&b.txt) do command
1
正确:
for /f "usebacq" %I in ("a&b.txt") do command
1
5.2 命令兼容
在批处理命令for /f %I in ('command1') do command2中,如果command1内包含单引号,便无法识别,此时使用"usebacq"参数后,command1可以使用后引号`(和~同一个键)围起来
正确:
for /f "usebacq" %I in (`command1`) do command2
1
5.3 字符串兼容
在批处理命令for %I in (sequence) do command中,如果sequence是字符串,需要用双引号包围。如果字符串内本身有双引号作为字符,此时使用"usebacq"参数后,sequence可以使用单引号围起来
正确:
for "usebacq" %I in ('str="a"') do command
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗