获取批处理脚本中包含filename的最新文件的绝对路径

时间:2015-05-20 17:15:25

标签: batch-file windows-shell

我有一个批处理文件,我想获取最新的“manifest”文件,所以我希望能够使用for循环,但我不确定正确的语法。

这就是我所拥有的:

for /R %imagePath% %%F in (*.manifest.*) do (set manFile=%%F)

返回“C:/some/path/to/file.manifest.ext”是正确的,但不一定是最新的。我看到其他问题,例如使用dir的问题,但是我没有得到整个路径。我使用dir执行此操作的尝试如下:

for /R %imagePath% %%F in ('dir /od *.manifest.*.*') do (set manFile=%%F)

这并没有给我我期待的输出。

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

set "manFile="
for /f "tokens=2,*" %%a in ('
    robocopy "%imagePath%" "%temp%" *.manifest.* /is /l /nocopy /s /njh /njs /ndl /nc /ns /ts
    ^| sort /r
') do if not defined manFile set "manFile=%%b"

这使用for /f来处理robocopy命令的输出,该命令将生成具有UTC时间戳的匹配文件的列表,该时间戳将被反向排序,因此最新的文件将是第一个列表。

答案 1 :(得分:0)

MC ND的解决方案很聪明。但当我尝试使用“”作为文件掩码时,我得到了错误的结果。原因是robocopy列出来自的相应文件源文件夹和(虚拟)目标文件夹,在本例中为%TEMP%。您可以通过将/xx开关添加到robocopy来修复此问题,或者只使用空的目标文件夹。由于我不是100%确定/xx开关将始终有效,因此我使用了为目标文件夹指定随机名称(希望不存在)。

原始代码的第二个缺点是FOR循环将不必要地执行,直到可以任意长的文件列表的末尾。

以下代码修复了目标文件夹问题,在获得结果后快捷方式循环,此外还导出树中最年轻文件的文件名和时间戳:

@echo off
setlocal

set "srcpath=%~1"
if not DEFINED srcpath set srcpath=%CD%
set /A skip=%2 - 1
set opt=
if DEFINED skip if %skip%0 GTR 0 set "opt=skip=%skip%"

set MASK=*.manifest.*
for /f "%opt% tokens=1,2*" %%a in ('
    robocopy "%srcpath%" %RANDOM%_%RANDOM% %MASK% /l /s /ts /njh /njs /ndl /nc /ns ^| sort /r
') do set "tstamp=%%a %%b" & set "youngestfile=%%c" & goto :ex

:ex
echo %youngestfile%    %tstamp%

该脚本现在最多可以使用2个参数。第一个参数是源文件夹,如果省略,则默认为当前文件夹。第二个参数是numeric,允许搜索第n个最年轻的文件。因此,例如“lastfile.2”将返回以当前文件夹为根的树中的第二个最年轻的文件。这是FOR循环从列表顶部开始的最新文件的副作用。