赞
踩
- 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于 DOS 和 Windows 系统中。批处理文件的扩展名为 bat(或 cmd)。通常我们指定的批处理指 DOS批处理脚本。
- DOS 批处理则是基于 DOS 命令的,用来自动地批量地执行 DOS 命令以实现特定操作的脚本。更复杂的情况,需要使用if、for、goto等命令控制程式的运行过程,如同 C、Python 等高级语言一样。如果需要实现更复杂的应用,利用外部程式是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。
常用命令也可见文章:链接
在bat脚本中,我们使用 ::
和 REM
添加注释,用法如下:
:: 打印“你好,世界!”
echo 你好,世界!
注意
::
只能出现在每一行的开头,其后的内容被当作注释REM
可用于任何位置,其后的内容被当作是注释变量类型包括:数字、字符串及数组。
:: 定义数字变量
set /a n=0
:: 定义字符串变量
set s1=hellworld
set s2="Hello World"
set "s3=Hello, World!"
:: 定义数组变量
set arr = 1 2 3 4 5 6
@echo off
set list=1 2 3 4
(for %%a in (%arr%) do (
echo %%a
))
注意:
=
连接且没有空格在bat脚本中,if条件判断语句共有6种比较操作符,分别为
操作符 | 描述 | 全称 |
---|---|---|
equ | 等于 | equal |
neq | 不等于 | no equal |
lss | 小于 | less than |
leq | 小于等于 | leq less than or equal |
gtr | 大于 | greater than |
geq | 大于等于 | geq greater than or equal |
注意:
==
表示if 条件 (
执行命令
) else (
执行命令
)
for /l %%x in (1,1,10) do (
echo 变量 x 的值是 %%x
)
@echo off
rem 定义函数
:myFunction
echo 这是我的函数
exit /b
rem 调用函数
call :myFunction
@echo off call :main ::---------------------------------------------------- setlocal enabledelayedexpansion rem 定义函数:获取字符串长度 :getStringLength set "str=%~1" set "len=0" :loop if defined str ( set "str=!str:~1!" set /a "len+=1" goto loop ) exit /b rem 返回调用点 endlocal ::---------------------------------------------------- :main call :getStringLength "Hello, World!" echo Length of string is: %len% call :getStringLength "Hello" echo Length of string is: %len% pause
:: 创建文件
echo Hello > myfile.txt
:: 复制文件
copy source.txt destination.txt
:: 移动文件
move source.txt destination_folder\
:: 重命名文件
ren oldname.txt newname.txt
:: 删除文件
del myfile.txt
set str1=Hello
set str2=World
set result=%str1% %str2%
echo %result%
这将输出 Hello World。在批处理中,可以使用 % 符号来引用变量,并使用空格将字符串连接起来。
set myvar=abcdef
set substring=%myvar:~0,3%
echo %substring%
这将输出 abc。:~ 后跟的是截取的起始索引和长度。在这个例子中,0,3 表示从索引 0 开始截取,长度为 3。
set myvar=abcdef
echo %myvar:~2%
这将输出 cdef。如果省略长度,则从指定的索引开始一直截取到字符串末尾。
set myvar=abc123abc
set newvar=%myvar:abc=xyz%
echo %newvar%
setlocal enabledelayedexpansion
用于启用延迟扩展(Delayed Expansion)模式,它是 Windows 批处理脚本中的一个特性。在启用延迟扩展后,! 可以用来获取变量的值,而不仅仅是 %。
在默认模式下,批处理脚本在执行代码块时会提前替换变量的值,因此如果在一个代码块中改变了变量的值,这个改变后的值在同一个代码块中将不会被正确地获取。启用延迟扩展后,可以使用 ! 来延迟获取变量的值,使得在代码块内部修改变量后,可以正确地获取到修改后的值。
endlocal
用于结束由 setlocal
开始的本地环境,恢复到调用 setlocal
之前的环境状态。
在批处理脚本中,setlocal
用于创建一个本地环境,这个本地环境中的变量和状态只对当前批处理文件有效,不会影响到其他批处理文件或者批处理文件的外部环境。endlocal
用于关闭这个本地环境,恢复到调用 setlocal
之前的环境状态。
这样做的好处是可以在脚本中创建临时的环境,进行一些操作,而不用担心对外部环境产生影响。通常在脚本的末尾会使用 endlocal
来确保脚本结束时本地环境被正确关闭,以免影响到其他的脚本执行。
可参考文件:链接
注意,bat 脚本不区分大小写。
:: 用于进行文本的注释,执行后不会回显内容。
rem 用于文本注释,执行后会回显内容。
@字符放在命令前将关闭该命令回显,⽆论此时echo是否为打开状态。
echo on
echo off
echo.
或 echo,
或 echo:
或 echo/
等echo
echo 信息内容
echo 答复语|执行的操作
echo 文件内容>文件名
echo 文件内容>>文件名
echo ^g
使当前程序暂停,并输出以下内容,作用是为了让我们知道程序运行到哪步了。
显示其他提示语:echo 其他提示语 & pause > nul
获取程序返回码:echo %errorlevel%
每个命令运⾏结束,可以⽤这个命令⾏格式查看返回码。⽤于判断刚才的命令是否执⾏成功,默认值为0,⼀般命令执⾏出错会设 errorlevel 为1。
设置cmd窗口的标题,语法如下:
title 我的窗口
设置默认控制台的前景色和背景色,语法如下:
color [前景色][背景色]
颜⾊属性由两个⼗六进制数字指定 – 第⼀个为背景色,第⼆个则为前景色。每个数字可以为以下任何值之⼀。
数值 | 颜色 | 数值 | 颜色 |
---|---|---|---|
0 | ⿊⾊ | 8 | 灰⾊ |
1 | 蓝⾊ | 9 | 淡蓝⾊ |
2 | 绿⾊ | A | 淡绿⾊ |
3 | 湖蓝⾊ | B | 浅绿⾊ |
4 | 红⾊ | C | 淡红⾊ |
5 | 紫⾊ | D | 淡紫⾊ |
6 | 黄⾊ | E | 淡黄⾊ |
7 | ⽩⾊ | F | 亮⽩⾊ |
示例如下:
通过goto
和:标号
可以实现跳转执行命令。
@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 GOTO start
pause
在文件中搜索字符串,语法如下:
find [/v][/c][/n][/i][/off[line]] "字符串" [[drive:][path]filename[...]]
- /v 显示所有未包含指定字符串的行
- /c 仅显示包含字符串的行数
- /n 显示行号
- /i 搜索字符串时忽略大小写
- /off[line] 不要跳过具有脱机属性集的文件
- “字符串” 指定要搜索的字符串
- [drive:][path]filename 指定要搜索的文件
批处理中用来调用外部程序的命令,语法如下:
start 外部程序 [参数]
参数:
/D path
指定程序的起始目录/MIN
最小化启动窗口/MAX
最大化启动窗口/WAIT
等待启动的程序结束后才继续脚本/B
在同一窗口中启动程序/b
隐藏控制台执行程序示例:start explorer d:\
将会使用图形界面打开D盘。
CALL命令可以在批处理执⾏过程中调⽤另⼀个批处理,只有当被调用的批处理执⾏完后,才能继续执⾏原来的批处理,语法如下:
call 指定批处理文件
assoc 和 ftype 可实现文件关联,语法如下:
assoc .txt ::显示.txt代表的“文件类型”,结果显⽰.txt=txtfile
ftype ::显示所有的文件类型关联
assoc .txt=Word.Document.8 ::设置.txt文件未word类型的文档,可看到.txt文件图标已改变
主要用于保存并返回初始目录,示例如下:
cd /d d:\mp4 ::更改当前⽬录为 d:\mp4
pushd c:\mp3 ::保存当前⽬录,并切换当前⽬录为 c:\mp3
popd ::恢复当前⽬录为刚才保存的 d:\mp4
条件判断语句,语法如下:
if [not] errorlevel number command
if [not] str1==str2 command
if [not] exist filename command
@echo off
mode con: cols=80 lines=30
echo This is a sample batch script.
echo It sets the console window size to 80 columns by 30 lines.
pause
在这个例子中,mode con: cols=80 lines=30
设置控制台窗口的列数为80,行数为30。
用在任何命令前面,实现关闭当前行的回显.
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*为命令⾏传递给批处理的参数
%0 批处理⽂件本⾝,包括完整的路径和扩展名
%1 第⼀个参数
%9 第九个参数
%* 从第⼀个参数开始的所有参数
DOS的标准输⼊输出通常是在标准设备键盘和显⽰器上进⾏的,利⽤重定向,可以⽅便地将输⼊输出改向磁盘⽂件或其它设备。其中:
>
将命令发送到⽂件或设备,例如打印机>prn>>
将命令输出添加到⽂件结尾⽽不删除⽂件中已有的信息<
从⽂件⽽不是键盘上获取命令所需的输⼊>&
符号将输出从⼀个默认I/O流(stdout,stdin,stderr)重新定向到另⼀个默认I/O流>>
和 >
有点类似,但他们的区别是 >>
是传递并在⽂件的末尾追加,⽽ >
是覆盖。
在命令行模式下设置的环境变量,属于临时环境变量,只针对当前的CMD命令窗口有效,并不影响其他窗口中的环境变量,更不会影响到永久性的环境变量,要设置永久的环境变量,需要通过图形操作修改。
CMD
set path=%path%;C:\test ::在原有环境变量的基础上追加环境变量
PowerShell
$env:path+="C:\test"
start cmd /k ::启动一个CMD且不关闭CMD
start cmd /c ::启动一个CMD且关闭CMD
start cmd /k "命令1 & 命令2 & 命令3" ::无论前面命令是否成功, 后面都会执行
start cmd /k "命令1 && 命令2 && 命令3 " ::仅当前面命令成功时, 才执行后面,一般用这个
start cmd /k "命令1 || 命令2 || 命令3" ::仅当前面命令失败时. 才执行后面
如果需要执行指定的脚本文件,请使用 call
命令,示例如下:
call test.bat
rundll32 sysdm.cpl,EditEnvironmentVariables
@echo off
set /p user_input=请输入内容:
echo 你输入的内容是:%user_input%
@echo off :: 打开指定软件 start notepad.exe :: 延时5秒 echo Waiting for 5 seconds... timeout /t 5 /nobreak >nul :: 激活虚拟环境 echo Activating virtual environment... call .\venv\Scripts\activate :: 执行python脚本 python test.py echo sucess! echo Windows will close in 5 seconds... timeout /t 5 /nobreak >nul
@echo off
start /b notepad ::打开记事本
@echo off
start /min cmd /c "notepad"
@echo off
powershell -WindowStyle Minimized -Command "notepad"
@echo off setlocal enabledelayedexpansion rem 设置文件所在目录路径 set "folderPath=C:\YourFolderPath" rem 进入目标目录 cd %folderPath% rem 循环处理每个文件 for %%F in (*) do ( rem 获取文件名(带扩展名) set "fileName=%%F" rem 移除字母部分,保留数字 set "newFileName=" for /L %%I in (0, 1, 9) do ( set "newFileName=!newFileName!!fileName:%%I=!" ) rem 重命名文件 ren "%%F" "!newFileName!" ) endlocal
@echo off setlocal enabledelayedexpansion rem 设置要处理的文件夹路径 set "folderPath=C:\Path\To\Your\Folder" rem 遍历文件夹 for /d %%i in ("%folderPath%\*") do ( rem 获取文件夹名 set "folderName=%%~nxi" rem 清除字母 set "folderNameWithoutLetters=" for /L %%j in (0, 1, 9) do ( set "folderName=!folderName:%%j=!" ) rem 重命名文件夹 ren "%%i" "!folderNameWithoutLetters!" ) endlocal
① 搜索当前目录是否存在以指定字符串结尾的文件夹
@echo off setlocal enabledelayedexpansion set "str=250096" REM 替换为您要搜索的字符串 set /a length=6 echo 搜索到以下文件夹: for /d %%i in (*) do ( set "folder_name=%%i" set "last_characters=!folder_name:~-%length%!" REM 将“长度”替换为您要检查的字符串的长度 if "!last_characters!" == "%str%" ( echo "!folder_name!" ) ) endlocal pause
@echo off echo ************************************************************************** echo * 修改IP地址、DNS * echo ************************************************************************** set /p ip="请输入指定的IP:" echo 正在修改IP地址和DNS服务器地址,请耐心等待………… echo 正在更改本机IP地址... netsh interface ipv4 set address name="以太网 5" source=static addr=%ip% mask=255.255.255.0 gwmetric=0 >nul echo. echo IP已修改为:[32m%ip%[0m echo. pause
https://www.jb51.net/article/250331.htm
http://www.taodudu.cc/news/show-3034558.html
https://www.w3cschool.cn/dosmlxxsc1/wvqyr9.html
https://www.runoob.com/linux/linux-shell-variable.html
https://www.hxstrive.com/subject/windows_bat.htm?id=36
https://cloud.tencent.com/developer/article/2118950
https://www.yiibai.com/batch_script/
https://zhuanlan.zhihu.com/p/415626343
http://t.csdn.cn/hJaPh
http://t.csdn.cn/3R7Be
http://t.csdn.cn/zFfr5
http://t.csdn.cn/JmcoH
http://t.csdn.cn/ui048
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。