如何在文件最大的文件夹中获取* .docx文件的文件名?

时间:2018-08-17 03:03:03

标签: batch-file

一个目录包含一个或多个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,应将其名称分配给环境变量。

上面的示例需要哪些批处理文件代码才能完成此任务?

1 个答案:

答案 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 /?