按特定日期/时间顺序循环浏览文件的批处理文件



特定日期/时间顺序循环访问文件

大家好

我正在努力为我已经使用了一段时间的批处理文件编写一个小的补充。首先,这里有一些我将要处理的示例文件名:

output.log, output.log.1, output.log.2, ..., outlput.log.199

输入文件集可能仅包含上述 1 个或几个文件(始终按显示的顺序排列,最新的在前,最旧的在最后),或全部 200 个文件。

我试图做什么

批处理文件用于对这些文件执行多项操作,例如将它们复制到新目录中,或创建参数列表以将它们传递到另一个命令中。一般来说,我所拥有的效果很好,它当时做了我想要的,但是,处理潜在文件集中的所有 200 个文件非常耗时。我现在要做的是限制进程文件的数量,只提取第一个文件,比如 20 个文件,或者(如果文件少于 20 个),所有这些文件。

遇到的问题是我使用的FOR循环按名称顺序而不是日期/时间顺序循环文件。因此,如果我在 20 次迭代后停止,我最终会得到:

output.log, output.log.1, output.log.10, outlput.log.100, outlput.log.101, ...

我需要能够按日期/时间顺序(最新的在前)循环访问文件集。我不知道日期范围是多少,或者文件是否在特定时间间隔,只有日志文件将始终按照第一个列表显示。

我拥有的代码

setlocal EnableDelayedExpansion
Set SnapDir=C:Snaps
Set SupportLog=unified_support.log
Set LogDir=varlog
Set ParsedLogDir=varlogparsed
set PARAMS=
set /A NumberSupportFiles=20
Set /A StartSupportCount=0
if [%1]==[] goto :eof
:loop
rem Create a Parameter list of all the Log files, Copy File then stop after a set number of interations
for %%A in ("%SnapDir%%~n1%LogDir%%SupportLog%*") do (
    set PARAMS=!PARAMS! "%%A"
    copy %%A "%SnapDir%%~n1%ParsedLogDir%"
    set /A StartSupportCount+=1
    if !StartSupportCount! EQU %NumberSupportFiles% goto :jump
)
:jump
pause

如前所述,这有点工作,它循环访问文件集中的前 20 个文件,但文件顺序是按名称而不是日期/时间。

从我目前所读到的内容来看,任何日期/时间操作似乎都需要一个确切的参考点或特定的界限,而且我看不到在循环之前对集合进行排序的方法。这可能吗?

你快完成了,你只需要用一个for /F替换for循环,它解析dir /B A:-D /O:-D的输出,它构成了一个按修改日期排序的文件列表(最新的在前):

@echo off
setlocal EnableExtensions EnableDelayedExpansion
Set "SnapDir=C:Snaps"
Set "SupportLog=unified_support.log"
Set "LogDir=varlog"
Set "ParsedLogDir=varlogparsed"
set "PARAMS="
set /A NumberSupportFiles=20
Set /A StartSupportCount=0
if "%~1"=="" goto :EOF
:LOOP
rem Create a Parameter list of all the Log files,
rem Copy File then stop after a set number of interations
for /F "eol=| delims=" %%A in ('
    dir /B /A:-D /O:-D "%SnapDir%%~n1%LogDir%%SupportLog%*"
') do (
    set "PARAMS=!PARAMS! "%%~A""
    copy "%SnapDir%%~n1%LogDir%%%~A" "%SnapDir%%~n1%ParsedLogDir%"
    set /A StartSupportCount+=1
    if !StartSupportCount! EQU %NumberSupportFiles% goto :JUMP
)
:JUMP
pause
endlocal
exit /B

最新更新