获取具有特定扩展名的目录中的最新文件

Nea*_*alR 7 batch-file

下面的批处理命令将为我提供文件夹中的最新文件,但我只查找具有特定扩展名的文件。任何人都可以解释如何指定扩展名(即.jpg

FOR /F "delims=|" %%I IN ('DIR "C:\Jenkins\Releases\C9metro" /B /O:D') DO SET NewestFile=%%I
Run Code Online (Sandbox Code Playgroud)

Mof*_*ofi 12

我建议使用以下几行:

\n
FOR /F "eol=| delims=" %%I IN (\'DIR "C:\\Jenkins\\Releases\\C9metro\\*.jpg" /A-D /B /O-D /TW 2^>nul\') DO (\n    SET "NewestFile=%%I"\n    GOTO FoundFile\n)\nECHO No *.jpg file found!\nGOTO :EOF\n\n:FoundFile\nECHO Newest *.jpg file is: "%NewestFile%"\n
Run Code Online (Sandbox Code Playgroud)\n

FOR循环也可以优化为单个命令行:

\n
FOR /F "eol=| delims=" %%I IN (\'DIR "C:\\Jenkins\\Releases\\C9metro\\*.jpg" /A-D /B /O-D /TW 2^>nul\') DO SET "NewestFile=%%I" & GOTO FoundFile\nECHO No *.jpg file found!\nGOTO :EOF\n\n:FoundFile\nECHO Newest *.jpg file is: "%NewestFile%"\n
Run Code Online (Sandbox Code Playgroud)\n

FOR在后台启动cmd.exe,并附加选项/c和命令行\'作为附加参数。在这种情况下,Windows 安装在后台执行C:\\Windows

\n
C:\\Windows\\System32\\cmd.exe /c DIR "C:\\Jenkins\\Releases\\C9metro\\*.jpg" /A-D /B /O-D /TW 2>nul\n
Run Code Online (Sandbox Code Playgroud)\n

内部命令DIR现在在指定目录中搜​​索与通配符模式匹配的文件系统条目,*.jpg并具有以下附加限制。

\n

该参数/A-D确保忽略通常也以字符串结尾的子目录.jpg

\n

该参数/B打开裸输出格式。在这种情况下,仅输出不带路径的文件名,即使包含空格或这些字符之一,也不会包含在命令DIR中,这些字符需要在其他命令行上通过\xc2\xa0 进一步处理时需要将文件名字符串包含在其中。"&()[]{}^=;!\'+,`~"cmd.exe

\n

该参数/O-D导致DIR输出按日期从最新到最旧的倒序列出的找到的文件名。换句话说,首先输出最新文件的文件名,最后输出最旧文件的文件名。

\n

并且参数/TW确保最后修改时间(写访问)用于按日期顺序对找到的 JPEG 文件的文件名进行排序,而不是创建时间或最后访问时间。

\n

长或短 8.3 名称中可能没有与通配符模式匹配的文件名,*.jpg在这种情况下,DIR会向后台命令进程的标准错误流STDERR输出一条错误消息。cmd.exe处理批处理文件会将错误输出重定向到其自己的标准错误流。这将导致在控制台窗口中显示错误消息,这对于批处理文件的用户来说并不真正有用。使用在后台启动的2>nul指令cmd.exe将错误消息重定向到设备NUL以抑制它。

\n

请阅读有关使用命令重定向运算符的Microsoft 文档,了解 的说明2>nul。当 Windows 命令解释器在执行执行嵌入的命令 FOR 之前处理此命令行时,重定向运算符必须在 FOR 命令行上使用脱字符进行转义,以便将其解释>文字^字符dir命令行。

\n

FOR分别cmd.exe处理批处理文件捕获写入后台启动的标准输出流的所有输出,并在启动完成执行命令DIRcmd.exe后自行关闭后逐行处理它。cmd.exe

\n

FOR on using 选项/F总是忽略空行,这在这里没有问题,因为使用选项的DIR不会输出空行。

\n

FOR接下来将使用水平制表符和普通空格作为字符串分隔符将行拆分为子字符串,如果第一个制表符/空格分隔的字符串以分号开头,则接下来将查找,在这种情况下,它也会忽略整行以进行进一步处理,否则将在运行FORI正文中的命令之前,仅将第一个制表符/空格分隔的字符串分配给指定的循环变量。

\n

不需要默认的行分割行为,因为 JPEG 文件名可以包含一个或多个空格。该选项的使用delims=定义了一个空的分隔符列表,它会关闭行分割行为。

\n

;JPEG 文件名以(分号)开头的情况很不常见,但仍然有可能。FOR不应忽略这样的\xc2\xa0 文件名。该选项eol=|将竖线定义为行尾字符,任何文件名都不能包含该字符。Microsoft 在有关命名文件、路径和命名空间的文档中列出了 Windows 文件系统上文件名中不允许使用的字符。

\n

因此, DIR从最新文件输出的第一个文件名被完全分配给循环变量I,并执行命令SET将此字符串分配给环境变量NewestFile

\n

*.jpg在第一个找到的与通配符模式匹配的文件被分配给环境变量时退出循环。这使得此方法比让DIR从最旧到第一个输出文件名并将所有文件名一个接一个地分配给变量NewestFile直到最后找到的文件(将是最新文件)更快。

\n

DIR上输出错误消息找不到任何文件,因此FOR无法将任何文件名字符串分配给循环变量I并在命令SETGOTO后运行。然后,在这种情况下退出批处理文件处理,如GOTO :EOF 返回到哪里?详细描述的那样。

\n

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

\n
    \n
  • dir /?
  • \n
  • echo /?
  • \n
  • endlocal /?
  • \n
  • for /?
  • \n
  • goto /?
  • \n
  • set /?
  • \n
  • setlocal /?
  • \n
\n

也可以看看:

\n\n


Nea*_*alR 2

还早……弄清楚了这一点:

'DIR "C:\Jenkins\Releases\C9metro\*.jpg"
Run Code Online (Sandbox Code Playgroud)