bat常用命令

定义

批处理文件(batch),对某对象进行批量的处理,是一种简化的脚本语言,应用于DOS和Windows系统中,扩展名为.bat或.cmd。复杂情况需使用if、for、goto等命令控制程序运行,利用系统本身提供的外部命令和第三方工具或软件。

  • DOS,Disk Operating System,磁盘操作系统,直接操作管理硬盘的文件。

分类

DOS批处理:基于DOS命令用来批量执行DOS命令以实现特定操作的脚本;
PS批处理:基于Photoshop用来批量处理图片的脚本;

运行

自上而下逐行执行
%~dp0d即drive,指磁盘,p即path,指路径
cd %~dp0进入批处理文件所在目录
cd %~dp0bin\进入批处理文件所在目录的bin目录

系统变量%SystemRoot%\system32\cmd.exe的配置,使得在桌面的bat文件不用加cd %~dp0就可以直接运行(其他路径的有时不加也能执行?)
在这里插入图片描述

参数

系统参数

%SystemRoot%C:\WINDOWS
%windir%
%ProgramFiles%C:\Program Files
%OS%Windows_NT (系统)
%HOMEDRIVE%C: (系统盘)

传递参数%

%0表示批处理命令本身,返回文件路径
在这里插入图片描述

%1-%9表示参数

call test.bat “hello” “haha” (执行目录下的“test.bat”文件,输入两个参数
在这里插入图片描述
在这里插入图片描述

文件内要按顺序从1~9,echo才会有信息返回,大于9的数字会当做字符串截取
在这里插入图片描述

adb shell

Linux

adb shell su -c " command "

Android

adb shell su 0 " command "

基本命令

cmd窗口执行help可查询所有命令

cmd窗口编码语言

窗口导栏右键-属性-选项-当前代码页,默认是936
在这里插入图片描述
chcp 65001可设置为utf-8
在这里插入图片描述
chcp 437可设置为美国英语,返回内容可以变成英文
在这里插入图片描述

taskkill终止进程

使用该工具按照进程 ID (PID) 或映像名称终止任务
在这里插入图片描述

/?获取帮助

获取命令的参数列表等
在这里插入图片描述

pause暂停运行

运行文件时,cmd窗口一闪而过不会保持,在最后加上pause,返回请按任意键后继续. . .或Press any key to continue. . .

@关闭当前命令行回显

所有命令都适用,不单对于echo
在这里插入图片描述

REM注释行

也可以用英文双冒号::

errorlevel错误码

常用来判断上条命令的执行情况
if errorlevel number command,返回的错误码大于或等于值执行command
if %errorlevel% 比较运算符 number command,比较执行command 在这里插入图片描述

EQU等于=
NEQNEQ!=
LSS小于<
LEQ小于等于<=
GTR大于 >
GEQ大于等于>=

echo显示信息

相当于print(),显示消息,或者启用或关闭命令回显

echo 内容直接显示

echo off关闭后面代码的回显
在这里插入图片描述

@echo off关闭所有代码的回显
echo off也不显示

echo on开启回显功能
在这里插入图片描述

echo后加英文小数点.显示echo的on或off
在这里插入图片描述

中文乱码显示,首部chcp 65001
执行pause返回的请按任意键继续. . .变成了Press any key to continue . . .

显示变量内容
set设置变量,批处理变量引导符%显示变量值
在这里插入图片描述

写入txt文件

  • 重定向符>传递覆盖内容
    文件不存在则新建,存在则进行内容覆盖。可以直接写入中文,不用加chcp 65001,因为txt文件本身就是UTF-8编码(有的中文会出现乱码,原因不明,所以最好还是加上)
    在这里插入图片描述
  • 重定向符>>末尾追加内容
    文件不存在则新建,存在则进行内容追加
    在这里插入图片描述

^显示特殊字符
特殊字符前加^,仅当为符号显示
在这里插入图片描述

控制命令

if判断

执行批处理程序中的条件处理

IF [NOT] ERRORLEVEL number command
# ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

if,echo和if要在同一行,否则程序会在输入后直接退出

set /p pwd="请输入密码:"
if %pwd%=="123456" echo 密码正确
if not %pwd%=="123456" echo 密码错误

if-else,else子句必须出现在同一行的 IF 之后

IF EXIST filename. (
    del filename.
) ELSE (
    echo filename. missing.
)

IF EXIST filename. (del filename.) ELSE echo filename. missing

if-elseif-else

set /p score=输入成绩:
if %score% lss 60 (
    echo 不及格
) else if %score% lss 70 (
    echo 及格
) else if %score% lss 80 (
    echo 良
) else if %score% lss 90 (
    echo 优
) else (
    echo 棒呆
)

在这里插入图片描述

语句扩展

IF [/I] string1 compare-op string2 command
# /I 开关(如果指定)说明要进行的字符串比较不分大小写。如果 string1 和 string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。
IF CMDEXTVERSION number command
# 作用跟 ERRORLEVEL 一样,除了它是在跟与命令扩展有关联的内部版本号比较。第一个版本是1。每次对命令扩展有相当大的增强时,版本号会增加一个。命令扩展被停用时,CMDEXTVERSION 条件不是真的。
IF DEFINED variable command
# 如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,你会得到其数值。
# 如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始命令行;否则,你会得到其数值
# 如果没有名为 CMDEXTVERSION 的环境变量,%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的字串符表达式;否则,你会得到其数值
xcopy默认5个ERRORLEVEL
0复制文件成功
1未找到复制文件
2用户通过CTRL C 终止了xcopy操作
4出现了初始化错误
5出现了磁盘写入错误

goto定向

将 cmd.exe 定向到批处理程序中带标签的行
GOTO label
:EOF将控制转移到当前批脚本文件的结尾,未定义则直接退出

例如:输入A或B,跳转到对应标签处
在这里插入图片描述

chcp 65001
@echo off
:write
set /p input=请输入A或B:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
REM echo 请输入A或B: 
goto write
goto EOF #多余了...

:A
echo 输入字母A
goto EOF

:B
echo 输入字母B
goto EOF

:EOF
pause

goto语句和标签要相对应

  • 只有goto没有标签,运行会直接退出。如在窗口执行,会提示系统找不到指定的批处理标签,之后的命令不会执行
    在这里插入图片描述
  • 只有标签没有goto,文件可以正常执行,但不会实现跳转
    在这里插入图片描述
  • 需有退出语句终止程序向下执行
    可以用exit语句直接退出窗口
    在这里插入图片描述
  • 同名标签执行最上面的,若没有退出语句,就接着执行后面的标签
    >

for循环

基础

对一组文件中的每一个文件执行某个特定命令

FOR %variable IN (set) DO command [command-parameters]
# %variable,指定一个单一字母可替换的参数(可为任意字母,但不要设置为0~9)
# (set),指定一个或一组文件。可以使用通配符

在批处理程序中使用 FOR 命令时,指定变量请使用%%variable而不要用 %variable。变量名称是区分大小写的,所以%i不同于%I(程序中用%I,执行不了)
在这里插入图片描述
>
在这里插入图片描述

注意
indo之间(set)内元素间可以用空格键、逗号、分号、等号隔开)
打印当前目录下所有文件的名称
在这里插入图片描述

for /D 语句扩展

指定与目录名匹配,而不与文件名匹配

FOR /D %variable IN (set) DO command [command-parameters]

在这里插入图片描述

for /R 语句扩展

检查以[drive:]path为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录规范,则使用当前目录。如果(set)仅为一个单点(.)字符,则枚举该目录树。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
@echo off
REM 当前目录下的所有文件,包括子目录
for /R %%i in (*) do echo %%i
REM E盘下所有文件,包括子目录
for /R E:/ %%i in (.) do echo %%i
REM E盘里所有扩展名为txt的文件
for /R E:/ %%i in (*.txt) do echo %%i
pause

循环的命令也可以通过()来换行,注意空格和缩进

# 实例:搜索 C 盘是否有 notepad.exe 。如果存在,则启动 notepad.exe 程序。
@echo off
for /R C:/ %%i in (notepad.exe) do (
    if exist %%i (
        echo 找到了 notepad.exe
        REM 去启动 notepad.exe
        start %%i
        goto end
    )
)
echo 没有找到 notepad.exe
:end

for /L 语句扩展

以增量形式从开始到结束的一个数字序列

FOR /L %variable IN (start,step,end) DO command [command-parameters]
# start:指定创建序列的开始位置
# step:for 语句创建序列时单步距离
# end:指定创建序列结束位置

在这里插入图片描述

for /F 语句扩展

fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。“options” 参数指定解析操作。

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
  • 默认解析,通过文件每行中分开的第一个空白符号来跳过空白行在这里插入图片描述
  • eol=c,指定字符开头的行为注释行
    在这里插入图片描述
  • skip=n,指定文件开始时忽略的行数
    在这里插入图片描述
  • delims=xxx,分隔符集,替换空格和制表符的默认分隔符集。允许指定一个或多个分隔符
    在这里插入图片描述

如果有指定,空格也要指定,否则就会出现以下情况:
在这里插入图片描述

空格指定不能放在最前或之间,否则会报错,一定要放在最后
在这里插入图片描述
在这里插入图片描述

  • tokens=x,y,m-n, 提取列数
  • tokens=m 表示 取第m列;
  • tokens=m,n 表示提取第m列和第n列;
  • tokens=m-n 表示提取第m列至第n列;
  • tokens=* 忽略行首的所有空格;
  • tokens=m* 提取第m列以后的所有字符,星号表示剩余的字符;
# 把adb devices的返回结果都记录到result.txt中
for /f "tokens=*" %%a in ('adb devices') do echo %%a >> result.txt

https://www.hxstrive.com/subject/windows_bat/72.htm

  • usebackq,改变解析方式

处理有空格的文件名" "
带空格的文件名,用双引号将文件名括起来。需要使用 usebackq 选项,否则,双引号会被理解成定义字符串的
在这里插入图片描述

处理文本字符串' '
用单引号将括号之间的 file-set 括起来,字符串会被当作文件中的单一输入行进行解析
在这里插入图片描述

chcp 65001
@echo off
REM 解析失败
for /F "usebackq tokens=1-3" %%a in ("张三|28|87") do echo %%a
REM 解析成功
for /F "usebackq tokens=1-3" %%a in ('张三 28 87') do (
   echo %%a
   echo %%b
   echo %%c
)
pause

处理 CMD 命令(``)
将括号之间的 file-set 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到内存中,并被当作文件分析
枚举当前环境中的环境变量名称:
for /F "usebackq delims==" %%i in (set) do echo %%i

FOR变量增强
https://www.hxstrive.com/subject/windows_bat/74.htm

其他命令

call当前窗口调用

CALL [drive:][path]filename [batch-parameters]
# batch-parameters 指定批处理程序所需的命令行信息

如果调用程序和被调用程序在同一路径下,直接CALL 文件名即可

  • 不传递参数
    在这里插入图片描述
  • 传递参数
    在这里插入图片描述

语句扩展
CALL:label arguments
arguments,对子程序指定要传送的信息,包括命令行选项、文件名、批处理参数或者变量
在这里插入图片描述

参数扩展

可以组合使用如 %~dp1,只将 %1 扩展到驱动器号和路径
%*所有的参数
%~1删除引号("),扩展 %1
%~f1将 %1 扩展到一个完全合格的路径名
%~d1仅将 %1 扩展到一个驱动器号
%~p1仅将 %1 扩展到一个路径
%~n1仅将 %1 扩展到一个文件名
%~x1仅将 %1 扩展到一个文件扩展名
%~s1扩展的路径只含有短名
%~a1将 %1 扩展到文件属性
%~t1将 %1 扩展到文件的日期/时间
%~z1将 %1 扩展到文件的大小
%~$PATH:1查找列在 PATH 环境变量的目录,并将 %1扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此修改符会扩展到空字符串
%1 和 PATH 可以被其他有效数值替换
chcp 65001
@echo off
echo 产生一个临时文件 > tmp.txt
 
REM 先保存当前目录,再将 c:\windows 设为当前目录
pushd c:\windows
call :sub tmp.txt
 
REM 恢复前次的当前目录
popd
call :sub tmp.txt
 
del tmp.txt
pause
 
:sub
echo 删除引号: %~1
echo 扩充到路径: %~f1
echo 扩充到一个驱动器号: %~d1
echo 扩充到一个路径: %~p1 
echo 扩充到一个文件名: %~n1
echo 扩充到一个文件扩展名: %~x1
echo 扩充的路径指含有短名: %~s1 
echo 扩充到文件属性: %~a1 
echo 扩充到文件的日期/时间: %~t1 
echo 扩充到文件的大小: %~z1 
echo 扩展到驱动器号和路径:%~dp1
echo 扩展到文件名和扩展名:%~nx1
echo 扩展到类似 DIR 的输出行:%~ftza1
REM 空行
echo.
 
goto :eof

在这里插入图片描述

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]

启动程序
在这里插入图片描述

启动脚本
start "ping" test2.bat设置脚本名称为ping
在这里插入图片描述

打开文件start 文件路径
打开网站start 网站URL

choice返回索引

setlocal 用来实现环境变量局部化,当批处理执行完毕后,定义的 input 变量将销毁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值