bat常用命令

文章目录

  • 定义
  • 分类
  • 运行
  • 参数
    • 系统参数
    • 传递参数%
  • adb shell
    • Linux
    • Android
  • 基本命令
    • taskkill终止进程
    • /?获取帮助
    • pause暂停运行
    • @关闭当前命令行回显
    • REM注释行
    • errorlevel错误码
    • echo显示信息
  • 控制命令
    • if判断
    • goto定向
    • for循环
      • 基础
      • for /D 语句扩展
      • for /R 语句扩展
      • for /L 语句扩展
      • for /F 语句扩展
  • 其他命令
    • call当前窗口调用
    • start另启窗口调用
    • choice返回索引

定义

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

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

分类

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

运行

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

系统变量%SystemRoot%\system32\cmd.exe的配置,使得在桌面的bat文件不用加cd %~dp0就可以直接运行(其他路径的有时不加也能执行?)
bat常用命令_第1张图片

参数

系统参数

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

传递参数%

%0表示批处理命令本身,返回文件路径
bat常用命令_第2张图片

%1-%9表示参数

call test.bat “hello” “haha” (执行目录下的“test.bat”文件,输入两个参数
bat常用命令_第3张图片
bat常用命令_第4张图片

文件内要按顺序从1~9,echo才会有信息返回,大于9的数字会当做字符串截取
bat常用命令_第5张图片

adb shell

Linux

adb shell su -c " command "

Android

adb shell su 0 " command "

基本命令

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

taskkill终止进程

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

/?获取帮助

获取命令的参数列表等
bat常用命令_第6张图片

pause暂停运行

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

@关闭当前命令行回显

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

REM注释行

也可以用英文双冒号::

errorlevel错误码

常用来判断上条命令的执行情况
if errorlevel number command,返回的错误码大于或等于值执行command
if %errorlevel% 比较运算符 number command,比较执行command bat常用命令_第7张图片

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

echo显示信息

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

echo 内容直接显示

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

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

echo on开启回显功能
bat常用命令_第8张图片

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

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

显示变量内容
set设置变量,批处理变量引导符%显示变量值
bat常用命令_第9张图片

写入txt文件

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

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

控制命令

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 棒呆
)

bat常用命令_第12张图片

语句扩展

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,跳转到对应标签处
bat常用命令_第13张图片

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

for循环

基础

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

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

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

注意
indo之间(set)内元素间可以用空格键、逗号、分号、等号隔开)
打印当前目录下所有文件的名称
bat常用命令_第19张图片

for /D 语句扩展

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

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

bat常用命令_第20张图片

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:指定创建序列结束位置

bat常用命令_第21张图片

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]
  • 默认解析,通过文件每行中分开的第一个空白符号来跳过空白行bat常用命令_第22张图片
  • eol=c,指定字符开头的行为注释行
    bat常用命令_第23张图片
  • skip=n,指定文件开始时忽略的行数
    bat常用命令_第24张图片
  • delims=xxx,分隔符集,替换空格和制表符的默认分隔符集。允许指定一个或多个分隔符
    bat常用命令_第25张图片

如果有指定,空格也要指定,否则就会出现以下情况:
bat常用命令_第26张图片

空格指定不能放在最前或之间,否则会报错,一定要放在最后
bat常用命令_第27张图片
bat常用命令_第28张图片

  • 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 选项,否则,双引号会被理解成定义字符串的
bat常用命令_第29张图片

处理文本字符串' '
用单引号将括号之间的 file-set 括起来,字符串会被当作文件中的单一输入行进行解析
bat常用命令_第30张图片

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 文件名即可

  • 不传递参数
    bat常用命令_第31张图片
  • 传递参数
    bat常用命令_第32张图片

语句扩展
CALL:label arguments
arguments,对子程序指定要传送的信息,包括命令行选项、文件名、批处理参数或者变量
bat常用命令_第33张图片

参数扩展

可以组合使用 如 %~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

bat常用命令_第34张图片

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]

启动程序
bat常用命令_第35张图片

启动脚本
start "ping" test2.bat设置脚本名称为ping
bat常用命令_第36张图片

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

choice返回索引

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

你可能感兴趣的:(bat,batch)