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

Posted

技术标签:

【中文标题】如何通过批处理文件中的时间戳识别/获取文件?【英文标题】:How to identify/get the file by its timestamp in a batch file? 【发布时间】:2020-11-26 01:06:46 【问题描述】:

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

【问题讨论】:

顺便说一句:我会推荐 PowerShell 而不是 cmd.exe shell/batch。 【参考方案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%

【讨论】:

嗨斯蒂芬,我尝试了你提供的代码,但是当我在 CLI 中运行它时,它说@echo off set source="C:\data\new" set target="C:\ data\target" FOR /F "delims=" %%I IN ('DIR %source%\Account_data_*.csv /A:-D /O:-D /B') DO COPY %source%\"%%I " %target% & echo %%I & GOTO :END :END 是脚本还是脚本的输出?注意:dir /o-d 按修改日期排序。这可能是也可能不是正确的顺序。由于您的文件很好地命名为 same_string_YYYY_MM_DD.csv,因此按名称 (/o-n) 排序更安全。【参考方案2】:

获取文件名中包含最新日期的 CSV 文件名的最简单、最快的方法是使用带有选项 /O-N 的命令 DIR 来获取按名称倒序排列的 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 文件名,从而打印文件系统返回的文件名,并按名称按字母顺序而不是颠倒的字母顺序显式排序。

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

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

编辑:

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

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

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

【讨论】:

以上是关于如何通过批处理文件中的时间戳识别/获取文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过用户界面中的插槽处理文件路径?

Python如何图像识别?

bat批处理 识别文件中的特定字符并移动到有相同特定字符的文件夹中去?

如何通过批处理命令获取SVN里的单个文件?

将目录中最近创建的csv文件的时间戳保存到变量中

批处理文件重命名(时间戳删除)