有勇气的牛排博客

windows bat 批处理常用命令

有勇气的牛排 607 Windows 2023-05-17 23:04:24

文章目录

1 介绍

批处理(Batch),也称为批处理脚本,批处理就是某对象进行批量的处理,通常被认为是一种简化的脚本语言。

批处理脚本应用于DOS和Windows文件中。

哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮

有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。

扩展名:bat或cmd

2 基础命令

2.1 echo、@、pause

echo [on|off] [message]

on|off:指定是否允许命令回显。
message:指定让MS-DOS在屏幕上显示的正文

@echo off echo hello pause

@(命令行回显屏蔽符):表示将不在DOS中显示 echo off命令
echo off:表示后续命令在DOS中不显示,只显示结果
pause:表示脚本执行完成后,不立即关闭DOS窗口,而是提示“请按任意键继续…”。当用户按了任意键后关闭窗口

@echo off rem 暂停,用户下键盘继续处理 echo hello &pause > nul echo 666 pause echo 777

2.2 批处理注释

格式REM [string]
格式::(两个冒号)

@echo off rem 这是第一个注释 :: 这是第二个注释 echo hello pause

2.3 title 标题

@echo off title 有勇气的牛排 echo 666 pause

在这里插入图片描述

2.4 color

帮助:color help

字体颜色 背景色 0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色 2 = 绿色 A = 淡绿色 3 = 浅绿色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 D = 淡紫色 6 = 黄色 E = 淡黄色 7 = 白色 F = 亮白色
@echo off title courageSteak rem 颜色设置 color f2 echo 666 pause

2.5 mode

配置设备

@echo off title courageSteak rem 这里设置命令行窗口大小 mode con cols=113 lines=15 & color 9f color f2 echo 666 pause

2.6 重定向符 >>>

重定向符:用于将某条命令的输出写到指定的地方,如写入到文件、nul(空设备)。

>:会覆盖文件中已有的内容。
>>:与 > 不同的是,>> 会将结果直接追加到指定文件的后面。

需求:将ping命令的输出信息写到ping.txt文件

@echo off ping www.baidu.com > ping.txt echo finished pause

2.7 屏蔽批处理错误

errorlevel
需求:加入使用copy拷贝文件到指定目录

在这里插入代码片

2.8 接收文件参数

单个参数

@echo off echo param0=%0 echo param1=%1 echo param2=%2 echo param3=%3 echo param4=%4 echo param5=%5 pause

image.png

使用shift命令接收多个参数

@echo off echo %1 %2 %3 shift /0 echo %1 %2 %3 shift /0 echo %1 %2 %3 pause

image.png

2.9 set 命令

2.9.1 set 基础用法

描述:用来显示、设置或删除 cmd 环境变量。

语法set [variable=[string]]

  • variable:指定环境变量名
  • string:指定变量值

实例:显示当前java环境变量

set java_home1

image.png

2.9.2 set扩展 /a

如果使用任何逻辑取余操作符,则需要将表达式字符串用引号括起来

@echo off rem 使用 /a 执行加法运算。 set /a val=10+22 echo %val% rem 变量val+10=42 set /a val2=%val%+10 echo %val2% rem 将16使用位移操作符,向右移动一位 等同于 除以2,val3=16/2=8 set /a "val3=16>>1" echo %val3% rem 使用分组符号提升加法的优先级 1+2+3)*3=6*3=18 set /a val4=(1+2+3)*3 echo %val4% rem 使用 %% 进行取余运算 set /a "val5=5%%2" echo %val5% pause

如果一个变量没有被定义,其值默认为0

@echo off set /a val=tmp+2 echo %val% rem 输出:2 pause

2.9.3 set扩展 /p

描述:用户输入

语法set /P variateName=promptStrig

  • variateName 为变量名
  • promptStrig 为提示字符串,将在 DOS 窗口中显示

实例:提示用户输入命令(此处win10测试未通过)

@echo off set /p username=username: echo username:%username% pause

2.10 setlocal/endlocal命令

定义:用来定义个一个局部区域,这个局部区域中的环境变量任何变化都不会改变原先的环境变量。

实例:局部区域修改path

@echo off echo 重置前 set path setlocal echo 重置path set path=E:\tools set path endlocal echo 重置path后 set path pause

2.11 shift 命令

定义:该命令用于更改普处理文件处理参数的方式,如指定处理参数的位置等。

帮助shift /?

实例1:利用shift命令动态输出批处理执行时所输入的所有参数。

@echo off :round if "%1"=="" goto cmd1 echo 参数:%1 shift goto round :cmd1 echo 没有获取到参数,结束脚本 goto end :end pause

image.png

2.12 获取磁盘路径 %~dp0

1、%cd%

@echo off rem 获取当前脚本所在路径 set basePath=%cd% echo %basePath% pause

2、%~dp0

该命令可以用来获取批处理文件的实际路径,与当前DOS环境所在的目录没有关系
d:为 Drive 的缩写,即为驱动器,磁盘;
p:为 Path 缩写,即为路径,目录;

不推荐使用 cd 命令,转到 %~dp0返回的目录
推荐使用: cd /d %~dp0

3 字符串操作

3.1 字符换截取操作

语法%variable:~n,m%

实例1:截取字符串

@echo off set str=abcdefghijklmnopqrstuvwxyz0123456789 echo 原字符串 echo %str% rem abcde echo 截取前5个字符 echo %str:~0,5% rem fghijklmnopqrstuvwxyz0123456789 echo 截取第6个字符直到最后一个 echo %str:~5% rem 56789 echo 截取最后5个字符 echo %str:~-5% echo %str:~-5,5% rem abcdefghijklmnopqrstuvwxyz01234 echo 截取第1个到倒数第6个字符 echo %str:~0,-5% rem defgh echo 从第4个字符开始,截取5个字符 echo %str:~3,5% rem 34567 echo 从倒数第7个字符开始,截取5个字符 echo %str:~-7,5% pause

3.2 字符串替换操作

实例1:你真棒,替换为:你特别棒

@echo off set str=你真棒 echo 替换前:%str% echo 替换后:%str:真=特别% pause

实例2:利用字符串替换功能,实现查找字符串是否包含指定字符

@echo off set str=hello,whlcome to Earth. echo 原文:%str% rem 判断str变量中是否存在 the 字符串 set "tmpStr=%str:the%" echo %tmpStr% if "%str%"=="%tmpStr%" ( echo 很抱歉!没有找到 ) else ( echo 存在字符串 “the” ) pause

3.3 字符串合并操作

将两个字符串合并到一起

@echo off set str1=Hello set str2=World rem 直接输出合并后的字符串 echo %str1%%str2% rem 将合并后的字符串放入 str 变量中 set str=%str1%%str2% echo %str% pause

4 if 语句

if 语句是执行批处理程序的条件语句。语法为:

if [not] errorlevel num command if [not] str1==str2 command if [not] exist filename command not:取反 errorlevel number:如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。 string==string2:判断字符是否相等 exist filename:判断文件是否存在

4.1 if

@echo off set /p pwd=请输入密码: if "%pwd%"=="123456" echo 密码正确 if not "%pwd%"=="123456" echo 密码错误:%pwd% set file=C:\Users\admin\Desktop\批处理\test1.bat if exist %file% echo %file% 文件存在 if not exist %file% echo %file% 文件不存在

4.2 if-else: 注意括号旁边的空格

@echo off set /p pwd=请输入密码: if "%pwd%"=="123" ( echo 密码正确 ) else ( echo 密码错误:%pwd% )

4.3 if-elseif-else

@echo off set /p score=请输入成绩: if %score% lss 60 ( echo 未及格 ) else if %score% lss 70 ( echo 及格 ) else ( echo 优秀 )

4.4 逻辑符

  • EQU - 等于
  • NEQ - 不等于
  • LSS - 小于
  • LEQ - 小于或等于
  • GTR - 大于
  • GEQ - 大于或等于

/I:表示不区分大小写

@echo off if "A" equ "A" echo A equ A if "A" == "A" echo A==A if /I "A" equ "a" echo A equ a if 100 equ 100 echo 100 equ 100 if 100 == 100 echo 100==100

DEFINED:与exist一样,还能取环境变量

@echo off set val=10 if defined val echo val=%val% if not defined val echo 没有定义 val 环境变量 if defined myPath echo val=%myPath% if not defined myPath echo 没有定义 myPath 环境变量

5 goto 语句

实例:要求用户输入字母(A或B),然后根据用户输入的字母显示不同提示信息

@echo off setlocal set /p input=请输入字母A或B: if "%input%"=="A" goto A if "%input%"=="B" goto B echo 您没有输入字母 goto endlocal :A echo 您输入的字母是A goto end :B echo 您输入的字母是B goto end :end
  • 代码退出也可以用:exit
  • 名字不可以使用变量
  • 如果有同名标签,则执行第一个

6 for 语句

实例1:执行简单的for循环

for %I in (ABC) do echo %I

image.png

@echo off rem 输出指定的字符串 for %%I in (ABC) do ( echo %%I ) for %%I in (ABC) do echo %%I

实例2:使用空格、分号、等号 分割

@echo off for %%I in (A B C) do echo %%I for %%I in (A;B;C) do echo %%I for %%I in (A,B,C) do echo %%I for %%I in (A=B=C) do echo %%I

image.png

实例3:打印批处理当前目录下所有文件名称、后缀为txt的文件的名称

@echo off rem 打印当前目录下面所有的文件名称 for %%i in (*.*) do echo "%%i" rem 打印当前目录下面所有后缀为 txt 的文件名称 for %%i in (*.txt) do echo "%%i"

6.1 for /D 扩展

for 语句默认匹配文件名。
/D:与目录名匹配

@echo off echo 匹配当前目录下面的 文件名 for %%i in (*) do echo "%%i" echo /D 匹配当前目录下面的 所有目录,不包含子目录 for /D %%i in (*) do echo "%%i" echo 搜索C盘下所有目录,不包括子目录 for /D %%i in (C:/*) do echo "%%i"

6.2 for /R 扩展

/R:递归进入目录,没有指定,则默认为当前目录树

实例1:搜索

@echo off echo 搜索当前目录下的所有文件 for /r %%i in (*) do echo %%i rem echo 输出D盘下所有目录 rem for /r d:/ %%i in (.) do echo %%i echo 搜索C盘里所有扩展名为exe的文件 for /r c:/ %%i in (*.exe) do echo %%i pause

实例2:搜索C盘是否有 notepad.exe可执行文件,如果存在则启动

@echo off for /r c:/ %%i in (notepad.exe) do ( if exist %%i ( echo 找到了 notepad.exe rem 启动 start %%i goto end ) ) echo 没有找到 :end

6.3 for /L 扩展

/L:表示以增量形式从start以每次增加 step,知道end的一个数字序列,如果start<end,就会执行该命令,反之,停止。

实例:遍历1-5,步长为2

@echo off for /L %%i in (1,2,5) do echo %%i pause

image.png

实例2:创建5~的序列

@echo off for /L %%i in (5,-2,1) do echo %%i pause

image.png

实例2:创建指定数量文件夹

@echo off for /L %%i in (1,1,5) do ( md 文件%%i ) pause

6.3 for /F 扩展

/F:主要用来处理文件和一些命令的输出结果,还可以提取文本文件的内容。

name#age#score tom#28#95 charles,32#99
# userinfo name age score tom 28 95 charles 32 99
@echo off echo 普通提取名字 for /F %%i in (test.txt) do ( echo %%i ) echo eol=c 省略指定字符开头的行 for /F "eol=#" %%i in (test.txt) do ( echo %%i ) echo skip=n 从文件头跳过的行数 for /F "skip=2" %%i in (test.txt) do ( echo %%i ) echo delims=# 使用#或,分割内容,如有空格放到最后 for /F "delims=#|,| " %%i in (test.txt) do ( echo %%i ) pause

tokens=x,y,m-n

tokens=m:表示提取第m列
tokens=m,n:表示提取m列和n列
tokens=m-n:表示提取m~n列
tokens=*:忽略行首的所有空格
tokens=m*:提取第m列以后的所有字符

@echo off for /F "delims=#|, tokens=3" %%i in (test.txt) do ( echo %%i ) pause

7 call 命令

call命令不但可以在普处理中调用另一个批处理程序,而且还可以调用指定标号后面的所有命令(也可以称为子程序)

7.1 调用外部程序

实例:创建2个批处理文件,分别为test.bat和sub.bat。在test.bat中调用sub.bat,不传递任何参数。

test.bat

@echo off echo test.bat call sub.bat a b call C:\Users\admin\Desktop\批处理\sub.bat c d pause

sub.bat

echo off echo sub.bat echo 第一个参数:%1 echo 第二个参数:%2

7.2 调用子程序

语法:call :label [arguments]

  • label:用于指定调用的位置标签,类似goto
  • arguments:对于以:label开头的批处理程序(或子程序),指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理参数或者变量;

实例:call sub标签

@echo off call :sub goto end :sub echo sub label :end pause
@echo off call :sub 10 goto end rem 子程序 :sub echo arg0=%0 arg1=%1 goto :eof :end pause
  • 子程序一般放在最后,并且在主程序最后加上exit或者跳转语句,避免错误进入子程序。
  • 子程序、主程序,变量均为全局变量

7.3 批处理(%n)增强

  • %~1 删除引号("),扩展 %1
  • %~f1 将 %1 扩展到一个完全合格的路径名
  • %~d1 仅将 %1 扩展到一个驱动器号
  • %~p1 仅将 %1 扩展到一个路径
  • %~n1 仅将 %1 扩展到一个文件名
  • %~x1 仅将 %1 扩展到一个文件扩展名
  • %~s1 扩展的路径只含有短名
  • %~a1 将 %1 扩展到文件属性
  • %~t1 将 %1 扩展到文件的日期/时间
  • %~z1 将 %1 扩展到文件的大小
  • %~$PATH:1 查找列在 PATH 环境变量的目录,并将 %1 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此修改符会扩展到空字符串

可以将增强符组合起来,可取得多重结果:

  • %~dp1 只将 %1 扩展到驱动器号和路径
  • %~nx1 只将 %1 扩展到文件名和扩展名
  • %~dp$PATH:1 在列在 PATH 环境变量中的目录里查找 %1,并扩展到找到的第一个文件的驱动器号和路径。
  • %~ftza1 将 %1 扩展到类似 DIR 的输出行。

实例:生成一个临时文件 tmp.txt,先将将目录 C:\windows设置为当前目录,调用子程序进行参数扩展;然后再恢复当前目录,调用子程序;观察参数扩展结果。

@echo off echo 创建一个临时文件 > tmp.txt rem 先保存当前目录,再将 c:\windows 设为当前目录 pushd c:\windows call :sub tmp.txt rem 回复前次的当前目录 popd call :sub tmp.txt pause del tmp.txt goto :end :sub echo 删除引号:%~1 echo 路径+文件:%~f1 echo 驱动器号:%~d1 echo 仅路径:%~p1 echo 文件名:%~n1 echo 文件扩展名:%~x1 echo 短名(与f感觉相同):%~s1 echo 文件属性(异常):%~a1 echo 文件的日期/时间:%~t1 echo 文件的大小:%~z1 echo 驱动器号和路径:%~dp1 echo 文件名和扩展名:%~nx1 echo 类似 DIR 的输出行:%~ftza1 goto :end rem goto :eof :end pause

8 start 命令

帮助: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] "title" 在窗口标题栏中显示的标题。 path 启动目录。 B 启动应用程序,但不创建新窗口。 应用程序已忽略 ^C 处理。除非应用程序 启用 ^C 处理,否则 ^Break 是唯一可以中断 该应用程序的方式。 I 新的环境将是传递 给 cmd.exe 的原始环境,而不是当前环境。

可以写绝对路径

实例:启动 notepad.exe 记事本程序

@echo off start notepad.exe

实例:启动一个子脚本,并设置titile为“测试”

@echo off start "测试" sub.bat

实例:最小化/最大化 启动记事本

@echo off rem 最小化启动 start /min notepad.exe rem 最大化启动 start /max notepad.exe

实例:检测 打开的记事本 是否关闭

@echo off start /wait notepad.exe echo 记事本被关闭

实例:打开指定网址

@echo off start www.couragesteak.com

9 pushd 和 popd 命令

定义:一般用于保存当前路径,并且切换到指定的新路径

语法:pushd [path | ..]

path:指定要切换的路径

实例:通过dos窗口切换到D盘,然后恢复

pushd D:\ popd

image.png


留言

专栏
文章
加入群聊