如何通过批处理文件中的时间戳来识别/获取文件?

问题描述 投票:0回答:2

我有一个带有日期和时间的 csv 文件列表,如“Account_data_yyyymmdd.csv”,每天都会将其及其时间戳添加到源目录。我必须识别最新文件,即“Account_data_2020_08_05.csv”并在变量中设置值。所以我可以将它作为参数传递

源目录中的文件

  • Account_data_2020_08_05.csv
  • Account_data_2020_08_04.csv
  • Account_data_2020_08_03.csv

我必须根据时间戳找到最近放置的文件并将其作为输入传递以调用另一个批处理过程。突出显示的文本是批处理文件的参数。如何根据时间戳查找最新文件并将其作为参数传递

echo "start"
call process.bat "C:\CSVDataLod"  AccntDataloadprocess ***"dataAccess.name=C:\SourceDir\ Account_data_%year%_%month%_%date%.csv"***
windows batch-file command-line batch-processing forfiles
2个回答
1
投票

这非常简单。使用

dir
/on
开关按名称排序(如果您不熟悉该开关和我使用的其他开关,请参阅
dir /?
)并放置一个
for /f
循环来捕获输出。以下代码将变量
%last%
设置为输出的每一行,仅保留最后一行:

for /f "delims=" %%a in ('dir /a-d /on /b Account_data_*.csv') do set "last=%%a"
echo %last%

0
投票

获取文件名中包含最新日期的 CSV 文件名称的最简单、最快的方法是使用命令 DIR 和选项

/O-N
来获取按名称逆序排列的 CSV 文件名输出。在这种情况下,DIR首先输出最新名称的文件名。必须使用 FOR 捕获并处理 DIR 的输出。运行另一个批处理文件(其第一个文件名由 DIR 输出)后,退出 FOR 循环。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FileFound="
set "FileNamePattern=Account_data_20??_??_??.csv"
if /I "%~x1" == ".csv" set "FileNamePattern=%~nx1"
for /F "delims=" %%I in ('dir "C:\SourceDir\%FileNamePattern%" /A-D /B /O-N 2^>nul') do (
    echo Processing file %%I ...
    call process.bat "C:\CSVDataLod" AccntDataloadprocess "dataAccess.name=C:\SourceDir\%%I"
    if /I not "%~1" == "/A" goto EndBatch
    set "FileFound=1"
)
if not defined FileFound echo There is no file "%FileNamePattern%" in directory "C:\SourceDir".
:EndBatch
endlocal

我建议打开命令提示符并运行:

dir "C:\SourceDir\Account_data_20??_??_??.csv" /A-D /B /O-N

然后你就知道哪些行是由FOR处理的。下次运行

dir "C:\SourceDir\Account_data_20??_??_??.csv" /A-D /B
dir "C:\SourceDir\Account_data_20??_??_??.csv" /A-D /B /ON

了解 DIR 如何在不指定特定顺序的情况下输出 CSV 文件名,从而打印文件系统返回的文件名,并按名称按字母顺序显式排序,而不是按相反的字母顺序。

文件系统 NTFS 返回按本地特定字母顺序与通配符模式匹配的文件名列表,而 FAT 文件系统(如 FAT16、FAT32、exFAT)返回根本不排序的文件名。实际上,所有文件系统都按文件系统表中存储的顺序返回文件名。文件系统仅使用不同的方法将文件名添加到文件系统的表中。 FAT 文件系统始终在目录表的末尾附加新文件名,而 NTFS 使用本地特定字母排序算法在目录表中插入新文件名。

阅读有关 使用命令重定向运算符的 Microsoft 文档,了解

2>nul
的说明。重定向运算符
>
必须在
FOR
命令行上使用脱字符号 ^ 进行转义,以便在 Windows 命令解释器在执行命令 FOR(执行嵌入的
dir
命令行)之前处理此命令行时将其解释为文字字符使用在后台启动的单独命令进程,并使用
%ComSpec% /c
'
中的命令行作为附加参数附加。

编辑:

批处理文件可以使用

/a
/A
作为参数运行,以处理从最新到最旧的通配符模式匹配的所有 CSV 文件,而不仅仅是最新的。批处理文件也可以使用源目录中的
.csv
文件名称运行,以处理此特定的 CSV 文件而不是最新的 CSV 文件。

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

  • call /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • setlocal /?
© www.soinside.com 2019 - 2024. All rights reserved.