求高手注释批处理代码!

2024-12-12 17:53:32
推荐回答(1个)
回答1:

不爱答批处理的题,没什么技术含量所以被好多人抢答的情况比较多。经常是一条命令能解决的问题,却偏有人喜欢采用看上去很长的答案……

整个脚本的作用就是让用户输入一个文件名,然后在所有的逻辑盘里找以这个名字命名的文件,自动打开(多个)资源管理器窗口并选定每个符合要求的文件。

代码的作者可能是单纯追求行数少(但实际上命令不少)、或者是故意不愿意让别人看懂,把脚本写得“很紧凑”。为了让程序逻辑看上去稍微清楚点,我重排了代码的格式。

@echo off&title 文件搜索&color 2
整行作用是关闭后续命令执行的控制台回显、设置窗口标题为“文件搜索”、设后续输出字符前景色绿色。其中,"@"的作用是让命令解释程序执行此句时不显示在控制台上;"&"在此的作用是将echo off三条命令缩在一行里,执行时三条命令会被依次执行。不推荐这样的写法,貌似很酷,但可读性和移植性不太好。

:S
这里设了个标号S,用于goto、call等语句

set /p H=文件名:&echo.&echo 正在搜索...
要用户输入文件名,并将用户输入设为环境变量H的值;输出空行和正在搜索。。。

for /f "skip=1" %%D in ('wmic LogicalDisk get name') do (
在wmic LogicalDisk get name命令(调用wmic.exe 即windows管理规范命令行接口程序,具体能实现的功能自己找文档或者控制台里执行wmic /?看吧)执行的输出中找到系统当前挂载的所有逻辑盘符。"/skip=1"是因为该命令输出的第一行有个"Name"不是盘符,需要跳过。for %%d在这些盘符里执行那个外层循环体。

if exist %%D\nul (
如果该逻辑驱动器存在正常的文件系统结构,……
if exist d:\nul这样的写法就不解释了,对于无盘的光驱、或者未格式化的盘,这个if块会被跳过不执行。

for /f "delims=" %%P in ('dir /a-d /s /b "%%D\*%H%" 2^>nul') do (
在dir命令输出中找到%%d盘中所有文件名结尾是用户输入的那个文件名的文件,执行循环体
dir的参数
/a-d 表示排除具有目录属性的项
/s 递归进入所有下级子目录
/b 仅显示文件完整路径(含文件名,即bare格式)
2^>nul 是将错误输出屏蔽,2号设备是stderr,2^>nul就是dir执行中使用stderr输出的错误信息屏蔽掉。

if /i "%%~nxP" equ "%H%" (
忽略大小写检查文件名是否与用户输入的那个文件名相同
%%~nxP 就是从刚才for语句的变量%%P的取值(那个完整的文件路径,带驱动器符、各级子目录、文件基本名和扩展名等)中,只取基本名和扩展名部分(~n取的是基本名,~x取的是扩展名,带点)

echo.&echo. 文件名: %H%&echo. 绝对路径: %%P&explorer /select,%%P
相同则显示信息、并打开Windows资源管理器、自动定位到该文件夹、并选定该文件,explorer具体用法自己看Windows帮助文件。
)
)
)
)

echo.&goto S
输出空行,跳回S循环