一个目录包含一个或多个Microsoft Word文档文件(* .docx)。我想获取具有最大文件大小的MS Word文件的文件名,并将其存储在变量中。
例如:
D:\file1.docx 257 KB
D:\file2.docx 850 KB
D:\file3.docx 122 KB
三个* .docx文件,其中file2.docx
的文件大小最大,为850 KB,应将其名称分配给环境变量。
上面的示例需要哪些批处理文件代码才能完成此任务?
答案 0 :(得分:0)
尝试此批处理文件:
@echo off
pushd "D:\"
for /F "eol=| delims=" %%I in ('dir *.docx /A-D /B /O-S 2^>nul') do (
if "%CD:~-1%" == "\" ( set "FileName=%CD%%%I" ) else set "FileName=%CD%\%%I"
set "FileSize=%%~zI"
goto OutputData
)
echo Could not find any *.docx in folder: "%CD%"
popd
goto :EOF
:OutputData
echo "%FileName%" is largest *.docx with file size: %FileSize%
popd
第一个设置为D:\
的批处理文件具有当前目录,同时将当前目录的路径压入堆栈。
下一步 FOR 在以cmd.exe /C
开头的单独命令过程中在后台命令行中执行:
dir *.docx /A-D-H /B /O-S 2>nul
DIR 在当前目录中搜索
/A-D-H
而导致的非隐藏文件(属性不是目录,也不是隐藏的)*.docx
/B
而没有路径/O-S
,所有找到的文件均按文件大小从大到小排列。 DIR 在未找到* .docx文件时输出的错误消息通过{{1}从句柄 STDERR 重定向到设备 NUL 禁止显示此错误消息。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符2>nul
必须在 FOR 命令行上使用脱字符号>
进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式^
命令行。
DIR 的输出以在单独的命令过程中处理 STDOUT ,由 FOR 捕获并逐行处理。
FOR 忽略空行和以分号开头的行。通过使用选项dir
,行尾字符从eol=|
修改为竖线,竖线与文件名可以作为第一个字符的分号相比,在文件名的开头不存在
FOR 使用正常的空格和水平制表符作为字符串定界符,将捕获的每一行分成多个子字符串。文件名可以包含一个或多个空格。通过使用选项;
,设置了一个空的定界符列表,因此根本不会拆分带有文件名的已处理行。
delims=
扩展到当前目录路径,不以反斜杠结尾,但当前目录是驱动器的根目录。因此,当前目录路径不带或带有附加反斜杠而与Microsoft Word文件输出的文件名和文件扩展名串联在一起,由 DIR 首先处理具有最大*文件名的捕获的第一行分配给循环变量%CD%
的.docx文件。
在为环境变量I
分配了完整的合格文件名并将该文件的文件大小分配给环境后,会立即退出 FOR 循环,并跳转到标签OutputData
。变量FileName
。
在最终退出批处理文件处理之前,将从堆栈中弹出初始当前目录的路径,然后再次将其设置为当前目录。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
FileSize
dir /?
echo /?
for /?
goto /?
if /?
popd /?
pushd /?