Windows 如何通过批处理文件中的时间戳来识别/获取文件?
我有一个附加日期和时间的csv文件列表,如“Account_data_yyyymmdd.csv”,每天随时间戳添加到source dir。我必须识别最新的文件,即“Account_data_2020_08_05.csv”,并在变量中设置值。所以我可以把它作为论点来传递 源目录中的文件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 我必须根据时间戳找到最近放置的文件,并将其作为输入传递给调用另一个批处理过程。突出显示的文本是批
- 账户数据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/?
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