我有一个批处理文件,我想获取最新的“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)
这并没有给我我期待的输出。
实现这一目标的最佳方法是什么?
答案 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
循环从列表顶部开始的最新文件的副作用。