1

我有一个附有日期和时间的 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"***
4

2 回答 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%
于 2020-08-05T19:55:47.290 回答
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 按本地特定字母顺序返回与通配符模式匹配的文件名列表,而 FAT16、FAT32、exFAT 等 FAT 文件系统返回根本没有排序的文件名。实际上,所有文件系统都按存储在文件系统表中的顺序返回文件名。文件系统只是使用不同的方法来将文件名添加到文件系统的表中。FAT 文件系统总是在目录表的末尾附加一个新文件名,而 NTFS 使用本地特定的字母排序算法在目录表中插入一个新文件名。

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

编辑:

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

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

  • call /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • setlocal /?
于 2020-08-06T06:27:02.490 回答