批处理

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

posted @   fsl  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示