我有一个带有日期和时间的csv文件列表,例如“ Account_data_yyyymmdd.csv”,并随其时间戳一起每天添加到源dir。我必须标识最新文件,即“ Account_data_2020_08_05.csv”并在variable中设置值。所以我可以将其作为参数传递
源目录中的文件
我必须根据其时间戳找到最近放置的文件,并将其作为调用另一个批处理的输入。突出显示的文本是批处理文件的参数。如何根据其时间戳查找最新文件并将其作为参数传递给
echo "start"
call process.bat "C:\CSVDataLod" AccntDataloadprocess ***"dataAccess.name=C:\SourceDir\ Account_data_%year%_%month%_%date%.csv"***
获取文件名中最新日期的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 /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
。Windows命令解释器在执行命令FOR之前,Windows命令解释器处理此命令行时,>
必须^
在FOR命令行上使用脱字符号将重定向操作符转义为文字字符,该命令在后台以和命令行启动的单独命令进程中执行嵌入式命令行内 作为附加参数。dir
%ComSpec% /c
'
编辑:
批处理文件可以使用/a
或/A
作为参数来运行,以处理与通配符模式匹配的所有CSV文件(从最新到最旧),而不仅仅是最新的。批处理文件也可以使用.csv
源目录中的文件名运行,以处理该特定CSV文件而不是最新的CSV文件。
为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
call /?
dir /?
echo /?
endlocal /?
for /?
goto /?
setlocal /?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句