window bat批处理脚本

参考:
https://www.cnblogs.com/dirgo/p/18108455
https://blog.csdn.net/AnChenliang_1002/article/details/131288871
https://www.cnblogs.com/jingxian666/p/16814375.html
https://www.hxstrive.com/subject/windows_bat/51.htm

什么是BAT

全称即Batch,批处理,是一类可执行的文本文件,扩展名为.bat。

注意:BAT脚本文件为ANSI编码(否则出现中文乱码)

常用命令与语法

1、注释

rem注释时,不执行后面的语句,但会显示;

:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)

%注释内容%(可以用作行间注释,不能出现重定向符号和管道符号)

@echo off
rem 注释1
echo 11
::注释2
echo 22
%注释3%
echo 33

pause

::结果
11
22
33
请按任意键继续. . .

2、开启关闭回显

@置于语句前则该条语句不会回显(无视echo on)

echo off关闭回显功能,直到出现echo on,但其本身会回显,往往和@一起使用,即@echo off(关闭所有回显功能)

echo 11

pause

::结果
C:\Users\ab225\OneDrive\桌面>echo 11
11

C:\Users\ab225\OneDrive\桌面>pause
请按任意键继续. . .



@echo off
echo 11

pause

::结果
11
请按任意键继续. . .

3、输出和换行

echo后加内容即输出该内容,如:echo “welcome!”;
echo.换行命令,即echo后加一个点

@echo off
echo 11
echo.
echo "换行后"
pause

::结果
11

"换行后"
请按任意键继续. . .

4、设置标题title

@echo off
::title设置标题
title 启动标题
::用以判断上一条命令是否执行成功,默认为0,出错为1
set a=%errorlevel%
echo %a%
if %a%==0 echo 执行成功
if %a%==0 (
echo 执行成功
) else (
echo 执行失败
)
pause


0
执行成功
执行成功
请按任意键继续. . .

set

1、定义变量和延迟赋值

@echo off
set b=1
::复合语句
set b=2 & echo %b%
::结果输出1
::解析
::windows在解释执行此代码段时,在遇到复合语句,只把它当一条语句处理而不是多条语句,
::所以,在第二条语句中的%b%会被替换成它目前的值b

:: setlocal enabledelayedexpansion用于开启变量延迟,这是告诉解释器,在遇到复合语句的时候,
::不要将其作为一条语句同时处理,而仍然一条一条地去解释。
::但是这时必须用!a!来引用变量,如果仍然用%a%引用是不起作用的
setlocal enabledelayedexpansion
set a=1
set a=2 & echo !a!
set a=3 & echo %a%
::结束延迟赋值的作用域
endlocal

pause


::输出
2
2

2、接收用户输入数据

@echo off
set /p a="请输入1:"
if %a% == 1 ( echo "输入了1" ) else (echo "输入的不是1")

pause

请输入1:1
"输入了1"
请按任意键继续. . .

3、系统变量

@echo off
::查看所有环境变量
set
::查看环境变量JAVA_HOME的值
if defined JAVA_HOME echo %JAVA_HOME%

pause

5、if语句

注意:if语句块在执行时是当做一条语句加载的,故需要延迟赋值来解决其内部变量引用的问题 - ?

@echo off
set /p a="请输入1:"
echo "判断1"
if %a% == 1 ( echo "输入了1" ) else (echo "输入的不是1")
echo.
echo "判断2"
if not %a% == 1 ( echo "输入的不是1" ) else (echo "输入了1")

pause


请输入1:1
"判断1"
"输入了1"

"判断2"
"输入了1"
请按任意键继续. . .

1、help/?

都可以用来查看某个指令的帮助文档。
语法格式:指令 /?或者是help 指令
如title /?,就是打印title这个指令的帮助文档。
需要注意,单独执行help,会打印出支持的所有指令以及简单的功能说明。

2、title

语法格式:title window_name
作用设置当前的cmd窗口标题

3、color

语法格式:color 16进制颜色格式
用来设置批处理控制台的背景和字体颜色,颜色属性由两个十六进制数字组成,第一个数字表示背景颜色,第二个数字表示字体颜色。
如color 07表示常规的黑底白字。

每个数字可以为以下值:
0=黑色
1=蓝色
2=绿色
3=湖蓝色
4=红色
5=紫色
6=黄色
7=白色
8=灰色
9=淡蓝色
A=淡绿色
B=淡浅绿色
C=浅红色
D=淡紫色
E=淡黄色
F=亮白色

4、mode

一般用来调整当前命令行窗口的大小、代码页等。
如:mode con cols=113 lines=15 & color 0A
就是调整窗口的长是113个字符,宽是15个字符,顺带给窗口换了换颜色,一般会放在最前面执行。
可以通过在cmd窗口中输入mode /?来查看详细功能。

5、echo

语法格式:
echo [{on|off}] [message]
on:允许批处理文件在处理时回显命令;
off:不允许。
在调用了echo off之后,接下来执行的所有命令都将不会在前台打印出命令本身。

使用on

::代码
echo on
dir
echo 111111

::输出
C:\Users\ab225\OneDrive\桌面>echo on
C:\Users\ab225\OneDrive\桌面>dir
 驱动器 C 中的卷是 Windows-SSD
 卷的序列号是 4CF7-0463
C:\Users\ab225\OneDrive\桌面 的目录
2024/08/03  13:08    <DIR>          .
2024/05/07  22:35    <DIR>          ..
2024/08/03  13:09                34 1 - 副本.bat
2024/07/24  22:51                62 1.sql
2024/07/08  10:08             5,781 11.ini
2023/04/04  20:43                30 122.185.bat
2024/05/20  10:04                28 14.17 - 副本.bat
2024/07/24  22:15             9,686 2.sql
2022/03/10  09:00                29 200.14.bat
2023/06/01  22:33               651 aardio.lnk
...(省略)
              43 个文件         52,827 字节
               4 个目录 27,495,849,984 可用字节

C:\Users\ab225\OneDrive\桌面>echo 111111
111111

使用off
可以看到,除了第一行命令外,其他命令本身都没有被打印出来

echo off
dir
echo 111111
pause

::输出

C:\Users\ab225\OneDrive\桌面>echo off
 驱动器 C 中的卷是 Windows-SSD
 卷的序列号是 4CF7-0463

 C:\Users\ab225\OneDrive\桌面 的目录

2024/08/03  13:08    <DIR>          .
2024/05/07  22:35    <DIR>          ..
2024/08/03  13:14                35 1 - 副本.bat
2024/07/24  22:51                62 1.sql
2024/07/08  10:08             5,781 11.ini
2023/04/04  20:43                30 122.185.bat
2024/05/20  10:04                28 14.17 - 副本.bat
2024/07/24  22:15             9,686 2.sql
2022/03/10  09:00                29 200.14.bat
...(省略)
              43 个文件         52,828 字节
               4 个目录 27,497,222,144 可用字节
111111

6、@

@可以加在一行命令的行首位置,表示禁止当前行命令本身回显在屏幕上
如:@echo on
相比使用echo on|off来控制整个脚本层级的回显,@可以更方便的控制行级的回显。

echo off
echo 111111
pause

:: 结果
C:\Users\ab225\OneDrive\桌面>echo off
111111
请按任意键继续. . .


::使用 @
@echo off
echo 111111
pause

::结果
111111
请按任意键继续. . .

7、pause

用于暂停批处理的执行,由用户决定是否继续执行。
会显示"按任意键继续。。“,同时卡住不再继续执行,除非用户点击了任意键之后,才会继续执行。
如果你不想让界面显示"按任意键继续。。”,但还想要让界面卡住不向下执行,则可以结合重定向符来实现

::使用 @
@echo off
echo 111111

::结果
111111
(窗口一闪而过)

::使用pause
@echo off
echo 111111
pause

::结果
111111
请按任意键继续. . .

::不显示 “请按任意键继续. . .”
@echo off
echo 1
pause
echo 2
pause > nul
echo 3

::结果:显示1后,按任意键,再显示2,再按任意键,显示3,然后窗口迅速关闭
1
请按任意键继续. . .
2
3

8、call

语法:
CALL [path] filename[.bat] [arguments]
[path] 是可选的,指定要调用的文件的路径如果与主批处理文件在同一目录下,则可以省略);
[filename]是要调用的批处理文件的名称;
[arguments] 是传递给被调用脚本的参数(如果有的话)。

1、调用其他的批处理文件
语法是:
call xxx.bat
①、无参调用

:: 主批处理文件(MainBatch.bat)
@ECHO OFF
ECHO 主批处理文件开始执行。
CALL SubBatch.bat
ECHO 主批处理文件执行完毕。
PAUSE


:: 子批处理文件(SubBatch.bat)
@ECHO OFF
ECHO 子批处理文件被调用。
PAUSE


::输出
主批处理文件开始执行。
子批处理文件被调用。
请按任意键继续. . .
主批处理文件执行完毕。
请按任意键继续. . .

②、带参调用


:: 主批处理文件(MainBatch.bat)
@ECHO OFF
ECHO 主批处理文件开始执行。
CALL SubBatch.bat Arg1 Arg2
ECHO 主批处理文件执行完毕。
PAUSE

:: 子批处理文件(SubBatch.bat)
@ECHO OFF
ECHO 子批处理文件被调用,参数1=%1,参数2=%2
PAUSE

::输出
主批处理文件开始执行。
子批处理文件被调用,参数1=Arg1,参数2=Arg2
请按任意键继续. . .
主批处理文件执行完毕。
请按任意键继续. . .

2、定义和调用批处理子例程

:: 主批处理文件(MainBatch.bat)
@ECHO OFF
ECHO 主批处理文件开始执行。
CALL :RunSubBatch Arg1 Arg2
ECHO 主批处理文件执行完毕。
PAUSE

:: 子批处理文件中的标签调用
:RunSubBatch
ECHO 子例程被调用,参数1=%1,参数2=%2
GOTO :EOF

::结果
主批处理文件开始执行。
子例程被调用,参数1=Arg1,参数2=Arg2
主批处理文件执行完毕。
请按任意键继续. . ..

1和2 可以一起用

3、使用CALL实现函数式编程

通过使用标签(Labels)和GOTO命令,我们可以在批处理中模拟函数的调用和返回。

@ECHO OFF
CALL :MyFunction
PAUSE
GOTO :EOF

:MyFunction
(
ECHO 这是一个使用CALL实现的"函数"echo "多行命令需要用括号,没有则不需要"
)

:: 结果
这是一个使用CALL实现的"函数""多行命令需要用括号,没有则不需要"
请按任意键继续. . .

ping命令

@echo off
ping 172.20.34.22
::无休止ping某地址
ping www.baidu.com -t

start命令

注意:执行start时将开启一个新线程来执行该程序,原程序不受影响继续执行

@echo off
echo 当前正在运行的批处理文件所在路径:%~dp0
start /b %~dp0bin\zkServer
pause

timeout延迟

@echo off
set a=1
::延迟五秒输出
timeout 5 >nul
echo %a%
pause

ren命令重命名文件(夹)

@echo off
::将1.txt重命名为58.bat
ren d:\test\1.txt 58.bat
::将d:\test\目录下所有文件名为1开头的txt文件改为bat文件
ren d:\test\1*.txt *.bat
::将d:\test\目录下所有文件名为1开头三个字符的bat改为txt文件
ren d:\test\1??.bat ???.txt

xcopy命令复制文件

@echo off
::将D:\test目录下所有文件()复制到F:\test1
::/F目录下所有文件(),/y已存在时直接覆盖
xcopy D:\test F:\test1 /e /y

del命令删除文件

@echo off
::删除该层目录下的所有文件,需要确认[Y/N]
del d:\test
pause
::不需要确认
del /q d:\test
::删除该目录下所有层级的文件,不删除文件夹,需要逐个文件夹确认
del /s d:\test
::删除文件111.png,不需要确认
del d:\test\111.png

move命令移动文件(夹)

@echo off
::文件夹移动,如果test文件夹存在,则将test5文件夹移动到test文件夹下
::如果test文件夹不存在,则将test5文件夹移动到test1文件夹下并重命名为test
::注意:文件夹移动不能跨分区
move e:\test5 e:\test1\test
::将d:\test\1.txt文件移动到e:\下并重命名为23.txt
::如果该目录已存在23.txt,则会覆盖
move d:\test\1.txt e:\23.txt>nul&&echo 移动成功并重命名
::将e:\23.txt文件移动到e:\test文件夹下
move e:\23.txt e:\test>nul&&echo 移动到文件夹下

md命令创建文件夹

:创建文件夹
md e:\test\test1
::文件夹名有空格需要加引号
 
md "e:\test op"
 
::空格隔开,创建多个
 
md e:\test1 e:\test9\test2 "e:\test5 test6"

变量%0–%9

%0指该文件本身,%1–%9为接收到的参数

for语句

常规

@echo off
::当你运行这段脚本时,它会列出当前计算机上存在的硬盘分区
::exist %%i: 会检查路径 %%i: 是否存在
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause

for/f

从一个或多个文件中读取内容,并将其逐行处理。这使得for/f成为处理文本文件、批量处理数据等任务的理想选择
语法:for /f ["options"] %variable in ('command') do command
options"表示一些可选的参数,
%variable用于定义一个用来存储命令输出值的变量,
'command’表示要执行的命令。

options常用的参数选项包括:
1、-delims
指定分隔符,用于将命令输出的每行数据分割成多个部分
2、-tokens
用于指定要存储的数据部分的位置。默认情况下,for/f命令会将整行数据存储到变量中
3、-skip
跳过指定的行数
4、-eol
指定行注释的字符

例子:
1、按行读取文件内容

::文本内容
apple
banana
duck
egg
frog

::脚本
for /f "tokens=*" %i in (c:\data.txt) do echo"%i"

::输出
C:\Users\Administrator>echo"apple"
"apple"
C:\Users\Administrator>echo"banana"
"banana"
C:\Users\Administrator>echo"duck"
"duck"
C:\Users\Administrator>echo"egg"
"egg"
C:\Users\Administrator>echo"frog"
"frog"

例子2
2、分割字符串

::config.txt的文件,内容
name=zhangsan
age=25

::脚本
for /f "delims== tokens=1,2" %i in (c:\config.txt) do echo Key:%i, Value:%j

::输出
C:\Users\Administrator>echo Key:name,Value:zhangsan
Key:name,Value:zhangsan

C:\Users\Administrator>echo Key:age,Value:25
Key:age,Value:25

goto

指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:goto label (label是参数,指定所要转向的批处理程序中的行)
行用 :label 表示

@echo off
:start
cls
set /p numis=请输入数字1或2:
if /i "%numis%"=="1" goto 1
if /i "%numis%"=="2" (goto 2) else (echo 输入有误!&&pause>nul&&goto start)
:1
echo 你输入的是1
pause>nul&&goto start
 
:2
echo 你输入的是2
pause>nul&&goto start

clip复制命令

::将文本文件的内容复制到剪贴板
clip < example.txt


@echo off
::echo 命令将输出文本重定向到管道 (|),然后 clip 命令读取管道中的内容并将它复制到剪贴板。
echo Hello, this is a test message. | clip
::窗口不显示东西
pause



::将几个命令的输出合并成一个字符串,并复制到剪贴板
@echo off
setlocal
rem 创建一个临时文件
set "tempFile=%temp%\clipboard_temp.txt"
rem 清空临时文件
>nul echo. > "%tempFile%"
rem 添加第一行文本
echo Line 1 >> "%tempFile%"
rem 添加第二行文本
echo Line 2 >> "%tempFile%"
rem 添加系统日期
echo Date: %date% >> "%tempFile%"
rem 添加系统时间
echo Time: %time% >> "%tempFile%"
rem 将临时文件的内容复制到剪贴板
clip < "%tempFile%"
rem 删除临时文件
del "%tempFile%"
pause

查看wifi密码

@echo off
:: 当前文件编码要和设置的编码一致,不然会乱码导致一些命令有问题
::chcp 65001   #换成utf-8代码页
::chcp 936       #换成默认的gbk
::chcp 437       #美国英语
chcp 65001 >nul
for /f "tokens=1* delims=:" %%i in ('netsh wlan show profiles ^| findstr /c:"All User Profile"') do (
    call :GetPass %%j
)
pause
::跳转到脚本的末尾,结束脚本的执行
goto :eof

:GetPass
echo WiFi : %*
for /f "delims=" %%a in ('netsh wlan show profile name^="%*" key^=clear ^| findstr /c:"Key Content"') do (
    echo %%a
)
goto :eof
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值