- 简述
- dos批处理脚本
- 后缀为 .bat 或者 .cmd
- 学习该命令目的: 删除电脑垃圾数据
- 遍历出磁盘内所有包含.bak .tmp .temp 文件的后缀, 并且删除
- 难点: 循环找出文件夹下的垃圾文件, 以及验证文件是否符合标准
- 常用
- 注释
:
定义标签的同时, 起到注释作用
: 注释
:: 注释
:? 注释
:& 注释
:label 注释
rem 注释
%%
不是指令, 不做回显, 用它作为单行注释
%注释%
- 多行注释
goto
语法 将处理器定位到要执行的行
goto label 注释部分 :label
label行, 跳过了注释部分goto demo 注释部分 :demo
demo行, 跳过了注释部分
if
语法
if 1==2(注释部分)
条件永远为假, 所以该注释部分不运行
- 常用
%
转义符- 赋值
set demo=1
变量赋值
- 输入
demo.bat 变量1 变量2
set /p demo = please import content:
变量赋值set /a
表达式赋值
set /a demo1=1, demo2=2
>> 1,2set /a demo1=1+2
>> 3
+
-
*
/
&
^
|
>>
<<
等…
- 打印
echo 打印内容
打印文本echo %demo%
打印变量echo %0%
打印执行程序输入的第一个值 类似执行命令: demo.bat demo1 >> demo.batecho%1%
打印执行程序输入的第二个值 类似执行命令: demo.bat demo1 >> demo
- 常用命令
echo
@
理解: 将命令放到一行执行, 且自动执行
@pause
接上个脚本@echo off ... @echo on
单个脚本的开始结束
goto
将脚本定位到带标签的行rem
注释符pause
按任意键继续
@pause
自动按任意键pause
需要手动按任意键
call
调用其他程序(倾向内部调用)
call demo.bat
运行程序call demo1
运行标签
start
运行程序并展示窗口
start file.txt
运行指定程序
if
条件语句
if 条件 (程序1) else (程序2)
exist
是否存在文件 if exist folder1 (条件) else
defined
判断变量是否存在errorlevel
判断上个命令的返回值
if a 条件表达式 b (程序)
==
>
<
equ
相等
for
循环语句
for
for %%i in (a b c) do @echo %%i
循环输出a, b, cfor %%i in (*.txt) do @echo %%i
循环当前盘符下.txt结尾的所有文件for %%i in (??.txt) do @echo %%i
循环当前盘符下两位字符且开头为.txt结尾的所有文件for %%i in (*.*) do @echo %%i
循环当前盘符下所有文件for %%i in (*.bak ,*.tmp,*.temp ) do echo %%i
找出当前盘符下所有垃圾文件
for /r
遍历文件夹
for /r [[drive:]path] %%variable in (set) do command [command-parameters]
[[drive:]path]
文件目录
for /r w: %%i in (*) do echo %%i
匹配当前文件下的所有文件
for /d
匹配文件夹
5.1. for /d %%i in (*) do echo %%i
匹配当前目录下的文件夹for /l
for /l %variable in (start,step,end) do command [command-parameters]
- start起始值
- step步间距
- end终止值
for /l %%i in (1 2 5) do echo %%i
>> 1,3,5
for /f
解析文本内容
delims
分割
for /f "delims=," %%i in (test.txt) do echo %%i
分割逗号for /f "delims=.," %%i in (test.txt) do echo %%i
分割多个
tokens
取多个
for /f "delims=, tokens=3" %%i in (test3.txt) do echo %%i
取第三个for /f "delims=, tokens=3,4" %%i in (test3.txt) do echo %%i %%j
取第三, 四个for /f "delims=, tokens=3-4" %%i in (test3.txt) do echo %%i %%j
取第三-四个
skip
行数跳过
for /f "skip=2" %%i in (test.txt) do echo %%i
跳过前两行
eol
忽略指定字符开头
for /f "eol=; " %i in (myfile.txt) do @echo %i %j
- 其他
for /f "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
for %%i in (*) do (echo %%i)
exit
退出del [filName]
命令
- DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
names
文件或者目录/p
删除每个文件前提示/f
强制删除只读文件/s
删除所有子目录中的指定文件, 并展示已经删除的文件/q
删除全局通配符, 不要求确认/a
根据属性选择要删除文件
- R 只读
- S 系统文件
- H 隐藏文件
- A 准备存档文件
- I 无内容索引文件
- L 重新分析点
- O 脱机文件
-
- DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
- 循环
- 条件语句
- 封装
存在问题: 无法删除包含空格的文件及文件路径
chcp 65001
setlocal enabledelayedexpansion
@echo off
:: 清理系统垃圾
:: 清理所有bak,tmp,temp,log结尾的垃圾文件
echo Clearing system files
for %%a in (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) do (
set disk=%%a:
echo clear disk !disk!
!disk!
cd ../../
for /r %%i in (*.bak,*.tmp,*.temp,*.log) do (
del /s /q /f /s "%%i"
)
)
echo Garbage removal completed
@echo. & pause
@echo on