1. bat 文件编码
使用 ANSI 编码格式,其他格式会报错或者中文不识别。
2. bat 注释
单行:两个英文冒号 或 rem(只有置于行首才有效)
多行:使用 goto 语句跳过
3. echo 输出
echo hello world
echo %a%
输出不存在的变量:ECHO 处于关闭状态。
4. @echo off
执行 bat 语句时不打印
5. bat 变量
1)设置变量 set var=AAA
注意:等号两边不留空格(空格也会赋值给变量);AAA 不同于 "AAA";
2)使用变量:用百分号包起来 %var%
3)使用 set 设置的变量在当前打开的命令行窗口有效,直到当前命令行窗口关闭
set a=AAA
set a1= AAA
set b="AAA"
set c=AA BB
echo %a%
echo %a1%
echo %b%
echo %c%
----执行结果:
AAA
AAA
"AAA"
AA BB
6. 切换盘符/目录操作
e:
cd subDir
cd ..
cd \
7. 执行其他命令:
注:执行失败不会阻塞后面的语句
1.start:继续执行后边语句,不阻塞
2.call 调用并阻塞,等待执行完成后再执行后边语句
3.默认不写为 call
4.获取上一条命令执行结果:%ERRORLEVEL%
rem 调用其他bat
call other.bat
rem 其他程序
svn update
test.py
notepad test.txt
start test.exe
rem 获取执行上一条命令执行结果
set result=%ERRORLEVEL%
if %result% equ 0 (
echo sucess!
) else (
echo error!
)
---------------------------语法相关-------------------------------
1. 获取启动参数
命令行启动bat:test.bat 1 2 3
test.bat 内容:
set p0=%0
set p1=%1
set p2=%2
set p3=%3
echo 第0个参数:%p0%
echo 第1个参数:%p1%
echo 第2个参数:%p2%
echo 第3个参数:%p3%
echo %p3%
----执行结果:
第0个参数:test
第1个参数:1
第2个参数:2
第3个参数:
ECHO 处于关闭状态。(不会阻断执行后面的yuj)
2. 逻辑判断
1)大小比较:数字字符串都可以比较,下面符号大小写都可以
注意:为空的变量比较会报错,可以两边都加双引号
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
2)判断相同用:==
注意:为空的变量比较会报错,可以两边都加双引号
set var1=a
set var2=b
if %var1% EQU a echo var1 EQU a
if %var2% lss %var1% echo var2 less var1
if %var2% GTR %var1% echo var2 GTR var1
if "%var3%"=="" (
echo var3 是空。
)
if %var1%==a (
echo var1==a
) else (
echo a not equal a
)
rem 不加引号报错:此时不应有 (。
if "%var3%"=="a" (
echo var3==a
) else (
echo var3!=a
)
----输出结果:
var1 EQU a
var2 GTR var1
var3 是空。
var1==a
var3!=a
3. 接受输入
set /p var=
4. goto 语句
:input
echo 输入参数(r,t):
set /p p=
if %p%==r goto or
if %p%==t goto ot
goto input
:or
echo there is or
:ot
echo there is ot
----输出:
输入参数(r,t):
o
输入参数(r,t):
r
there is or
there is ot
5. 获取路径
c:
rem:有切换目录,%cd% 会变化
echo 当前cmd路径:%cd%
echo 当前bat所在目录:%~dp0
echo bat完整路径:%~f0
echo bat所在根目录:%~d0
echo bat所在路径(去掉根盘符):%~p0
echo bat文件名(包含扩展名):%~nx0
echo bat文件名(不含扩展名):%~n0
echo bat扩展名:%~x0
echo bat文件属性:%~a0
echo bat修改时间:%~t0
echo 文件大小(字节数):%~z0
echo bat多个信息:%~ftza0
F:
----执行结果:
当前cmd路径:C:\Windows\System32
当前bat所在目录:F:\ddt2_tag\GenerateTool\
bat完整路径:F:\ddt2_tag\GenerateTool\test.bat
bat所在根目录:F:
bat所在路径(去掉根盘符):\ddt2_tag\GenerateTool\
bat文件名(包含扩展名):test.bat
bat文件名(不含扩展名):test
bat扩展名:.bat
bat文件属性:--a------
bat修改时间:2020/07/08 15:08
文件大小(字节数):2623
bat多个信息:--a------ 2020/07/08 15:08 2623 F:\ddt2_tag\GenerateTool\test.bat
6. 文件/文件夹相关操作
rem 删除文件
del mytest/test.txt
rem 删除目录及其包含目录及文件;/s:删除子目录及包含文件;/q:不询问,直接删除
rd /s /q mytest
rem 创建文件夹
md mytest
rem 创建文件
echo aa >> mytest/test.txt
echo bb >> mytest/test.txt
rem 上面生成test.txt 并有两行内容:aa bb
rem 判断是否存在文件、文件夹
if exist dir echo exist dir
if exist file echo exist file
rem 拷贝 /s(复制目录和子目录,除了空的) /e(复制目录和子目录,包括空的) /y(询问覆盖等自动选是);xcopy文件时会询问是文件还是目录,copy不会。
xcopy test\* test1 /e /y
copy aa.txt bb.txt
rem 打开文件夹浏览
explorer mytest
rem 修改文件名:
ren aa.txt bb.txt
rem ren 修改包含子目录的目录失败:拒绝访问。
rem 通配符:
rem 将a开头的改为b开头
ren a*.txt b*.txt
rem 将b开头并文件名为2个字符测改为a开头
ren b?.txt a?.txt
rem 移动文件夹:移动目录(目录不为空)
move dir1/dir11 dir2/dir22
7. 循环目录
set dir=F:\ddt2_tag\GenerateTool\mytest
rem dir 参数:/s 包含子目录,/b 只显示文件夹和文件,/a-d 只显示文件,/ad 只显示文件夹
for /f "delims=" %%i in ('dir /b /a-d /s %dir%') do echo %%~fi
rem 并读取文件内容:
for /f "delims=" %%i in ('dir /b /a-d /s %dir%') do (
echo %%~fi
for /f "delims=" %%I in (%%~fi) do (
echo %%I
)
)
8. for /f 相关用法
作用:读取/处理 字符串,文件,命令
参数:
eol=@ -指定一个行注释字符,遇到@开头的行就忽略掉。
skip=n - 指定在文件开始时忽略的行数。
delims=xx - 指定分隔符(可多个)。默认是空格和TAB。
tokens=x,y,m-n - 指定获取delims分割后的列内容
usebackq - 1.把单引号字符串作为命令;2.允许双引号扩起文件名称。
rem 字符串
for /f %%I IN ("checkversion.bat") DO (
echo %%I
)
rem 文件
for /f %%I IN (checkversion.bat) DO (
echo %%I
)
rem 命令行
for /f %%I IN ('set config') DO (
echo %%I
)
rem 命令行:`` 和 usebackq 结合使用才有效
for /f "usebackq" %%I IN (`set config`) DO (
echo %%I
)
rem 文件而不是字符串:usebackq 和 ""
for /f "usebackq" %%I IN ("test.xtx") DO (
echo %%I
)
rem 参数 eol: 忽略 @ 开头的行 (只能一个字符)
for /f "eol=@" %%I in (test.txt) do (
echo %%I
)
rem 参数 skip: 忽略开始行数
for /f "skip=5" %%I in (test.txt) do (
echo %%I
)
rem 参数 delims:指定分隔符。默认是空格和TAB。
rem 默认情况:只能取到分开后的第一个
for /f %%I in (test.txt) do (
echo %%I
)
rem 取前3个元素
for /f "tokens=1-3" %%I in (test.txt) do (
echo %%I %%J %%K
)
rem 不分割(把默认分割也去掉)
for /f "delims=" %%I in (test.txt) do (
echo %%I
)
rem 指定分割,取的分割后的个数
for /f "tokens=1-3 delims=," %%I in (test.txt) do (
echo %%I %%J %%K
)
rem 取指定取得元素
for /f "tokens=1,3,4 delims= " %%I IN ("11 22 33 44 55 66") DO (
echo 1=%%I, 2=%%J, 3=%%K
)
echo.
rem ------------------------
rem 示例
rem tokens 使用星号(*),后面的不分割了
for /f "tokens=1,* delims= " %%I IN ("11 22 33 44 55 66") DO (
echo 1=%%I, 2=%%J
)
rem 注:tokens=2,* 同 tokens=2*
rem 以分号分割:
set str="11"22"33"44"55"66"77"
echo %str%
for /f tokens^=2^,5^ delims^=^" %%I IN (%str%) DO (
echo 1=%%I, 2=%%J
)
----示例输出:
1=11, 2=22 33 44 55 66
"11"22"33"44"55"66"77"
1=22, 2=55
9. 配置数组
set config[1].name=name1
set config[1].score=100
set config[2].name=name1
set config[2].score=100
set cur_index=1
for /f "tokens=1-3 delims==." %%I in ('set config[%cur_index%]') do (
echo %%J = %%K
)
---- 输出
name = name1
score = 100
10. 数学计算
set a=10
set /a b=a+10
set /a d=a-5
set /a e=a*5
rem 只能取到商,无小数
set /a c=a/4
echo %b%, %d%, %e%, %c%
---输出结果:
20, 5, 50, 2
11. 字符串处理
分割字符串用: for /f
截取字符串:
set str=0123456789abcdefghijklmnopq
echo 完整字符串: %str%
echo 截取前3个字符:%str:~0,3%
echo 截取后3个字符:%str:~-3%
echo 截取第3个到倒数第2个之间:%str:~2,-1%
echo 截取第3个后的5个长度:%str:~3,5%
echo 截取第3个到第五个:%str:~2,5%
echo 截取从倒数第8个,长度5:%str:~-8,5%
rem 是否包含字符串:
echo %str%| findstr 12345 >nul && (
echo find 12345
)
----输出:
完整字符串: 0123456789abcdefghijklmnopq
截取前3个字符:012
截取后3个字符:opq
截取第3个到倒数第2个之间:23456789abcdefghijklmnop
截取第3个后的5个长度:34567
截取第3个到第五个:23456
截取从倒数第8个,长度5:jklmn
find 12345
替换,拼接:
rem 替换字符串
set str=AA123456AABB
set str1=%str:AA=CC%
rem 拼接:
set str1=AA
set str2=BB
set str=%str1%%str2%
echo %str%
12. 时间
echo %time%
echo %date%
----输出结果:
16:18:52.77
2020/07/08 周三
13. 是否包含
set a=r
for %%I in (r,t) do (
if %a%==%%I (
echo find !!!!!!!!!!!
goto forEnd
)
)
:forEnd
14. 读取文件指定内容,下载网络资源
@echo off
set file=test.txt
rem 读取文本 test.txt 取得第一个 url= 的行,把的值取出来
for /f "tokens=1,2 delims==" %%a in (%file%) do (
echo %%a| findstr url >nul && (
set remotePath=%%b
goto forEnd
)
)
:forEnd
echo remotePath: %remotePath%
echo 访问远程连接:%remotePath%
rem 下载远程连接内容到 getUrl.html 中
curl %remotePath% -o getUrl.html
------------其他用法------------------
1. 判断某应用程序是否在运行
for /f %%i in ('tasklist') do (
if %%i==xxx.exe (
echo find xxx.ext
goto forEnd
)
)
:forEnd
2. 查看环境变量
rem 查看所有环境变量
set
rem 查看变量名环境变量
set 变量名
rem 将环境变量设置为val,只在当前 cmd 窗口有效
set 变量名=val
rem 删除某个环境变量,当前窗口有效
set BL=