目录
4.:: 打印路径以确认 echo Target directory: %target_dir%
6. del /q "%target_dir%\*.jpg"
8.echo Directory does not exist.
(为了手机端读者的方便,文章开头插入一下目录~~~)
前言
前段时间,小编在整理电脑中文件夹时发现了一个问题,有很多相同类型的文件已经很久不再使用了,留下来也会占据内存,但一一手动删除又太过于繁琐,于是,我想到了可以用Windows批处理文件帮助我解决问题,对于批处理文件,我也是一知半解,在各类网站上查询了解后才做出了可以满足上述需求的简易批处理文件,下面将会展示文件创建的流程、文件中包含的命令和bat批处理文件创建时小编遇到的问题和解决方法
文章内容简单,小编也是小白,成果仅供参考,若有异议,欢迎大家积极留言讨论~~
创建流程
首先鼠标右键新建文本文档(文本文档是很神奇的东西,通过修改文件后缀名,它可以变成各种各样的文件类型~)
切换成英文后,正常打字输入如下图片中的演示文字
文件地址可以通过直接打开文件资源管理器,在打开的文件上方右键,选择复制地址即可获得~
在完成上述操作后,保存文件,重命名,将原本的文本文档后缀名txt更换为bat,在弹出的警告窗口中,选择“是”
涉及到的命令
下面是对上述批处理文件中每一个命令的详细说明:
1.@echo off
- 功能:关闭命令回显。在执行批处理文件时,通常命令会在窗口中显示。使用
@echo off
可以让批处理文件执行时不显示每一行的命令,只显示输出结果。 @
符号:表示这行命令本身也不被显示。
2.setlocal
- 功能:开始一个局部环境。所有在
setlocal
之后定义的变量将在脚本结束时消失,防止对全局环境的影响。
3.set "target_dir="
- 功能:定义一个名为
target_dir
的变量,存储目标目录的路径。双引号内的内容确保变量值的正确设置。
4.:: 打印路径以确认 echo Target directory: %target_dir%
- 功能:使用
echo
命令打印出当前的target_dir
变量的值。::
是注释符号,表示这一行是注释,不会被执行。此时输出内容帮助确认目标目录是否正确。
5.if exist "%target_dir%" (
- 功能:检测
target_dir
指定的目录是否存在。如果存在,则执行括号内的命令;如果不存在,则执行else
部分的命令。
6. del /q "%target_dir%\*.jpg"
- 功能:使用
del
命令删除目标目录内所有扩展名为.jpg
的文件。/q
选项表示安静模式,不会显示删除确认信息,从而加快删除操作。
7.else
- 功能:结束
if
语句的then
部分,跟随的else
表示如果if
条件不满足(即目录不存在),将执行括号内的命令。
8.echo Directory does not exist.
- 功能:如果目标目录不存在,打印提示信息 “Directory does not exist.”,告知用户该目录并不存在。
9.pause
- 功能:暂停批处理文件的执行,等待用户按任意键。这使得用户可以查看输出的信息,而不是立刻关闭窗口。
10.endlocal
- 功能:结束局部环境,恢复到执行
setlocal
之前的环境状态。所有在setlocal
之后定义的变量(如target_dir
)都将消失,防止影响全局环境。
注意事项(遇到的问题)
-
无法删除子文件夹中的文件,无法同时批量删除多类型的文件
这一点会在接下来介绍的升级版中解决~~~
-
重命名没有显示出后缀名,无法更改文件类型
在设置中搜索“文件资源管理器选项”,在弹出的窗口中选择查看,取消勾选“隐藏已知文件类型的拓展名”选项即可,再次对文件夹重命名就会看到显示出的文件后缀了
-
删除后的文件不会出现在回收站中!
所以请谨慎删除,可以用一个样例来试着运行,成功后即可正式使用
-
创建完成后无响应,或者在展示窗口中出现乱码
如果出现这样的情况,可能是编码类型有误,可按需更改,一般为UTF-8,ANSI,一种尝试失败无反应后可以换成另一种,更改方式——右键你创建的批处理文件,点击编辑,在弹出的窗口左上角点击文件,选择另存为,在弹出的新窗口下方就会出现编码,点击后即可在下滑列表中选择适用的类型
对于编码类型的详细解释如下
在 Windows 批处理文件中,不同的编码类型可能会影响脚本的解析和执行。具体来说:
-
ANSI 编码:
- ANSI 编码通常使用系统默认的代码页,支持基本的 ASCII 字符及一些额外的字符。
- 如果你的脚本中只有 ANSI 可识别的字符,脚本可以正常运行。
-
UTF-8 编码:
- UTF-8 编码支持更多的字符(包括国际字符),但在某些情况下(尤其是在没有 BOM 的情况下),Windows 的命令行解释器可能无法正确解析 UTF-8 文件。
- 如果你的脚本保存为 UTF-8 而没有 BOM(Byte Order Mark),批处理文件的解析可能会出错,导致命令无法执行。
解决方法:
如果你想使用 UTF-8 编码,可以尝试以下方法:
-
加上 BOM:确保你的文本编辑器在保存脚本时添加 BOM。这有助于 Windows 知道文件是以 UTF-8 编码。
BOM 是 “Byte Order Mark” 的缩写,中文通常称为“字节顺序标记”。它是用来标识文本文件编码的一种特殊字符,尤其是在 UTF-16 和 UTF-8 编码中,BOM 在文件的开头插入几个字节,以帮助软件识别该文件的编码格式。
主要用途:
- 标识编码:BOM 可以使文本编辑器和操作系统知道文件是使用哪种编码,从而正确解析文件内容。
- 处理复杂的字符:在多语言环境中,使用 BOM 可以更好地处理特殊字符和符号。
在 UTF-8 中的情况:
- UTF-8 的 BOM 是由三个字节组成的:
EF BB BF
。- 在某些情况下,尤其是在 Windows 平台,添加 BOM 会让一些程序(如 Notepad)正确识别文件的 UTF-8 编码并顺利打开文件。但某些其他程序(如传统的命令行工具)可能会对 BOM 产生误解,导致解析错误。
-
使用chcp命令:在脚本顶部添加
chcp 65001
,以切换到 UTF-8 代码页。不过,请注意,这种方法并不能保证所有命令都能按预期工作。 -
保持使用 ANSI:如果你的脚本中没有特殊字符,使用 ANSI 编码是最简单的选择。
示例:
如果你要确保文件是 UTF-8 编码并且能正常执行,可以使用比如 Notepad++ 编辑器:
- 打开你的批处理文件。
- 在菜单中选择
编码
->以 UTF-8 带 BOM 编码
。 - 保存文件后重新运行。
命令展示
@echo off
setlocal
set "target_dir=这里输入文件路径"
:: 打印路径以确认
echo Target directory: %target_dir%
if exist "%target_dir%" (
echo Directory exists.
del /q "%target_dir%\*.这里输入你想批量删除的文件类型"
echo Deleted all .这里输入你想批量删除的文件类型 files.
) else (
echo Directory does not exist.
)
pause
endlocal
效果弹窗展示
升级版命令
这里我将对上述提出的问题1做出解决方案,以下是提出的两种解决方案
方法 1:使用多个 del
命令
@echo off
setlocal
set "target_dir=这里输入文件地址"
:: 打印路径以确认
echo Target directory: %target_dir%
if exist "%target_dir%" (
echo Directory exists.
del /q /s "%target_dir%\*.jpg"
del /q /s "%target_dir%\*.png"
del /q /s "%target_dir%\*.txt"
echo Deleted all .jpg, .png, and .txt files.
“这里的三种文件类型仅供参考举例,可以结合自己的实际问题进行修改”
) else (
echo Directory does not exist.
)
pause
endlocal
方法 2:使用循环遍历文件类型
@echo off
setlocal
set "target_dir=输入文件地址"
set "file_types=jpg png txt" :: 在这里指定文件类型
:: 打印路径以确认
echo Target directory: %target_dir%
if exist "%target_dir%" (
echo Directory exists.
for %%f in (%file_types%) do (
del /q /s "%target_dir%\*.%%f"
echo Deleted all .%%f files.
)
) else (
echo Directory does not exist.
)
pause
endlocal
说明
-
方法 1:你手动列出了每个文件类型的
del
命令。这种方法简单直观,但如果需要删除的文件类型很多,可能会使代码变得冗长。 -
方法 2:通过
for
循环遍历你在file_types
变量中定义的所有文件类型。这种方法更加灵活,而且易于管理。只需修改file_types
变量即可添加或删除文件类型。 -
可以发现,这次的命令中的“del /q”之后,加入了“/s”
del /q /S "%filetype%"
:将会从当前目录以及所有子目录中删除匹配的文件。这个选项使得命令能够递归地搜索并删除所有子目录中的目标文件。
在使用这段代码之前,请确保将 target_dir
的路径正确设置为你要删除文件的目录,并谨慎操作,以免误删重要文件。
解释(可能提出的问题与解答)
上述的方法2中,%%f是什么意思?
在批处理文件中,%%f
是一个变量,表示在 for
循环中每次迭代时的当前文件类型。当你在批处理文件中使用 for
循环时,使用 %%
来定义变量。
具体来说:
-
for %%f in (%file_types%)
表示对变量file_types
中的每个元素(即每种文件类型)进行循环。每次循环,%%f
将替换为当前正在处理的文件类型,如jpg
、png
或txt
。 -
例如,当循环第一次执行时,
%%f
将是jpg
,第二次是png
,第三次是txt
。
如果你在命令行窗口(而不是批处理文件)中使用 for
语句,你需要使用单个 %
符号(即 %f
)来表示变量。所以:
- 在批处理文件中使用
%%f
- 在命令行中使用
%f
方法2中,为什么在写for循环的时候,其中file_types的前后要加入百分号?
在批处理文件中,百分号 %
用于表示变量。%file_types%
是访问名为 file_types
的变量的值。
具体来说:
-
set "file_types=jpg png txt"
定义了一个变量file_types
,它的值是jpg png txt
。这个变量存储了你想要删除的文件类型。 -
当你在
for
循环中使用%file_types%
时,是在获取这个变量的值,以便for
循环可以遍历这个值。
在 for
循环中,当执行 for %%f in (%file_types%)
时,%file_types%
被解析为 jpg png txt
。这样,for
循环能正确地以每个文件类型为单位进行迭代。
所以,简单总结一下:
%file_types%
是用来访问变量file_types
的值。%%f
是在for
循环中使用的变量,它表示当前循环到的文件类型。
结束语
小编也是小白,不是什么高手,难免犯错,这篇文章也是因为小编遇到了可以通过批处理文件来解决的问题,才主动去网上各地搜罗资源简单学习,这种通过遇到问题而促进我自发学习的感觉十分美妙,这也是我写文章,编代码和命令的动力所在,这篇文章的主要目的也不是为了教书育人,只是希望把我自己的学习之路记录下来,与诸位共勉学习,编写不易,如果有什么问题,大家可以多多在评论区留言提问,如果发现我有什么错误的地方,也可以指出批评,总之,希望各位畅所欲言,不吝赐教~~~
目前,小编还是一名普通的在读学生,如果各位有想了解关于软件工程,计算机科学与技术等此类专业的问题,可以与我畅聊,我也会知无不言言无不尽的
谨以此篇献予我质朴的求学之路