windows bat系列3:利用dir全系统查找文件

背景

公司工作需要写DOS批处理代码,扩展思考了下如何查找文件,花了我很大精力才写出此脚本,因而记录下。

代码

::关闭命令回显
@echo off

::变量延时绑定
setlocal enabledelayedexpansion

::请求输入文件名,支持通配符
echo Please input filename:
set /p filename=


::查看所有卷信息,赋值给变量,^表示换行符
for /f "delims=^" %%i in ('fsutil fsinfo drives') do (
	set juaninfo=%%i
	)
	
::echo显示所有卷信息
echo %juaninfo%

::遍历所有卷查找文件
for %%i in (%juaninfo%) do (
	echo %%i | findstr [A-Z]>nul && (set n=%%i & set target=!n!%filename% & set "target=!target: =!" & dir !target! /s /q)
)

pause

测试结果:

程序分析:

         脚本中带的注释基本能解释脚本的流程了,这里我再额外说明几点:

1.      @echo off 用于关闭echo回显;请参阅:

.bat批处理(一):@echo off

2.      setlocal enabledelayedexpansion

设置本地为延时扩展,其实也就是:延迟变量,全称延迟环境变量扩展。下面是dos官方解释(setlocal /?)

开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。

3.      set /p filename=,此语句表示请求用户输入变量---所要查找的文件名。

4.      第一个for语句主要是执行fsutil fsinfo drives命令,该命令显示当前系统所有磁盘分区信息;利用for语句是为了将其执行结果赋值给变量:juaninfo;

此处补充一点:DOS脚本中符号^ 表示换行符----切记切记

5.      从第一个for循环中我们得到的磁盘分区信息如下:

驱动器: C:\ D:\ E:\ G:\ H:\

因而,我们应思考怎样遍历盘符信息,还要过滤掉前面的“驱动器:”部分。我们再次采用FOR循环(默认用空格分割字符串),不过FOR执行的命令语句采用一系列步骤:

    a. 管道符 |

说明:前面命令的输出作为后面命令的输入;

    b. findstr进行结果过滤

    c. &&

说明:前面命令执行成功后才执行后面的命令,意思是查找到A~Z之间的字符串子串后再执行后面的操作;

d.      &&后面加()表示后面是个命令块:

      A. set n=%%i:表示将for循环得到的字符重新赋值给变量n;

    B. set target=!n!%filename% :进行字符串拼接,因为dir查找命令必须要带上盘符,所以我们把盘符信息拼接到文件名之前;

    C. set "target=!target:=!":进行字符替换,target冒号后面有个空格,B步骤拼接出来的字符串中间有空格,需要将空格去掉;---具体其搜索其他博文,这玩意也整了我好久;

      D. dir !target! /s /q:最后一步,借助dir进行文件查找,/S 表示递归指定目录及其子目录;

e.      &符号

前面的命令执行后接着执行后面的命令

符号小结:

| 前面命令输出结果作为后面命令的输入内容
|| 前面命令执行失败的时候才执行后面的命令
& 前面命令执行后接着执行后面的命令
&& 前面命令执行成功了才执行后面的命令

总结:

后续大佬们或许有其他方法实现,还望指点。只不过这个小小的脚本花费了我些许精力,因而记录下。感谢

猜你喜欢

转载自blog.csdn.net/zhaogang1993/article/details/80547001