如何通过批处理文件中的时间戳 identify/get 文件?

How to identify/get the file by its timestamp in a batch file?

我有一个 csv 文件列表,其中附加了日期和时间,如“Account_data_yyyymmdd.csv”,每天将其连同时间戳一起添加到源目录中。我必须确定最新的文件,即 'Account_data_2020_08_05.csv'并在变量中设置值。所以我可以把它作为参数传递

源目录中的文件

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

echo "start"
call process.bat "C:\CSVDataLod"  AccntDataloadprocess ***"dataAccess.name=C:\SourceDir\ Account_data_%year%_%month%_%date%.csv"***

这出奇的简单。将 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%

获取文件名中包含最新日期的 CSV 文件名的最简单和最快的方法是使用命令 DIR 和选项 /O-N 来获取 CSV 文件名输出按名称倒序排列。在这种情况下,DIR 首先输出具有最新名称的文件名。 DIR 的输出必须用 FOR 捕获和处理。 FOR 循环在 运行 与 DIR.

输出第一个文件名的另一个批处理文件之后退出
@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

我建议开一个command prompt和运行

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 文件名,从而导致将文件名打印为 return 由文件系统编辑并明确排序名称按字母顺序排列,而不是按相反的字母顺序排列。

文件系统 NTFS return 是按本地特定字母顺序与通配符模式匹配的文件名列表,而 FAT 文件系统如 FAT16、FAT32、exFAT return 文件名未排序全部。在真正的所有文件系统中 return 文件名按顺序存储在文件系统的 table 中。文件系统使用不同的方法将文件名添加到文件系统的 table。 FAT 文件系统总是在目录的 table 末尾附加一个新文件名,而 NTFS 使用本地特定的字母排序算法在目录的 table 中插入一个新文件名。

阅读有关 Using command redirection operators 的 Microsoft 文档,了解 2>nul 的解释。重定向运算符 > 必须在 上用脱字符 ^ 进行转义,以便在 Windows 命令解释器处理此命令时将其解释为文字字符 命令行执行命令 FOR 之前的行,该命令在后台启动的单独命令进程中执行嵌入式 dir 命令行 %ComSpec% /c' 中的命令行作为附加参数附加。

编辑:

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

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • setlocal /?