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

Windows 如何通过批处理文件中的时间戳来识别/获取文件?,windows,batch-file,command-line,batch-processing,forfiles,Windows,Batch File,Command Line,Batch Processing,Forfiles,我有一个附加日期和时间的csv文件列表,如“Account_data_yyyymmdd.csv”,每天随时间戳添加到source dir。我必须识别最新的文件,即“Account_data_2020_08_05.csv”,并在变量中设置值。所以我可以把它作为论点来传递 源目录中的文件 账户数据2020 08 05.csv 账户数据2020 08 04.csv 账户数据2020 08 03.csv 我必须根据时间戳找到最近放置的文件,并将其作为输入传递给调用另一个批处理过程。突出显示的文本是批

我有一个附加日期和时间的csv文件列表,如“Account_data_yyyymmdd.csv”,每天随时间戳添加到source dir。我必须识别最新的文件,即“Account_data_2020_08_05.csv”,并在变量中设置值。所以我可以把它作为论点来传递

源目录中的文件

  • 账户数据2020 08 05.csv
  • 账户数据2020 08 04.csv
  • 账户数据2020 08 03.csv
我必须根据时间戳找到最近放置的文件,并将其作为输入传递给调用另一个批处理过程。突出显示的文本是批处理文件的参数。如何根据其时间戳查找最新文件并将其作为批处理文件的参数传递

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

这非常容易。使用
dir
和开关上的
/on
按名称排序(如果您不熟悉该开关和我使用的其他开关,请参见
dir/?
),并为/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
我建议你开一家超市,然后跑步

然后您就知道哪些行是由处理的。下一轮

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文档,以了解有关nul的说明。当Windows命令解释器在执行
FOR
的命令之前处理此命令行时,重定向操作符必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的dir命令行命令进程在后台启动,并将
%ComSpec%/c
'
中的命令行作为附加参数附加

编辑:

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

要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
  • dir/?
  • echo/?
  • endlocal/?
  • 获取/?
  • goto/?
  • setlocal/?

你好,Stephan,我尝试了你提供的代码,但当我在CLI中运行它时,它显示@echo off set source=“C:\data\new”set target=“C:\data\target”FOR/F“delims=“%%%I in('DIR%source%\Account\u data.*.csv/A:-D/O:-D/B')DO COPY%source%\“%%I”%target%%echo%%I&GOTO:END:END这是脚本还是脚本的输出?注意:
dir/o-d
按修改日期排序。这可能是正确的顺序,也可能不是。由于您的文件名很好地命名为
相同的字符串\u yyy\u MM\u DD.csv
,按名称排序(
/o-n
)更安全。顺便说一句:我建议使用PowerShell,而不是
cmd.exe
shell/batch。
dir "C:\SourceDir\Account_data_20??_??_??.csv" /A-D /B
dir "C:\SourceDir\Account_data_20??_??_??.csv" /A-D /B /ON