用于生成文件名比保存日期时间戳更新的列表的批处理脚本

batch script to generate a list with file names newer than a saved date timestamp

我有一个登陆目录,我们每天收到 10-15 个文件。然后我 运行 一个批处理脚本来创建一个包含新登陆的文件名的列表,然后 informatica 读取文件名列表来处理新的源文件。

这里的问题是,如果在 informatica 加载文件后的同一天编辑文件。我的批处理脚本无法识别更新的文件,因为该文件具有相同的日期和名称。

有没有办法根据时间戳比较文件并生成文件列表?任何帮助将不胜感激。谢谢! 当前批处理脚本代码:

rem this batch script is used to list all the files hosted newly to a xyz landing directory
set LandingDir=\path\to\landing\directory\*.csv

set DateFile=%sys_var%\script\DateFile.txt
set LastRunDateFile=%sys_var%\scripts\LastRunDateFile.txt
set Temp_File_List=%sys_var%\scripts\Temp_File_List.txt
set File_List=%sys_var%\SrcFiles\File_List.txt
set /P _PreviousDate=<%DateFile%
type %DateFile% > %LastRunDateFile%
xcopy "%LandingDir%" /l /s /d:%_PreviousDate% .>%Temp_File_List%
type %Temp_File_List% | findstr /v File(s)>%File_List%
echo %date:~4,2%-%date:~7,2%-%date:~10,4% >%DateFile%

在 Windows 上,如果文件以任何方式被修改,archive 属性总是自动设置在文件上。

使用存档文件属性使任务比存储所有已处理文件的最后修改文件时间和比较下一个 运行.

的最后修改文件时间要容易得多

所有需要做的就是删除已经处理的文件的存档属性,即添加到文件列表。

示例:

@echo off
setlocal
set "FilePattern=*.csv"
set "sys_var=C:\Temp\Test"
set "File_List=%sys_var%\SrcFiles\File_List.txt"
set "LandingDir=\server\share\path\to\landing\directory"

if exist "%File_List%" del "%File_List%"

for /F "delims=" %%I in ('dir "%LandingDir%\%FilePattern%" /AA-D /B 2^>nul') do (
    echo %LandingDir%\%%I>>"%File_List%"
    %SystemRoot%\System32\attrib.exe -a "%LandingDir%\%%I"
)

if not exist "%File_List%" echo No new file!
endlocal

命令 DIR returns 因为 /AA-D 只有 文件 (不是目录)和 archive 属性设置为 bare 格式,因为 /B.

所以DIR输出,FOR处理的只是设置了archive属性的文件名,没有路径,始终没有包围双引号,即使文件名包含 space 或其他特殊字符。

文件名将由 DIR 返回,并带有完整路径,另外使用 DIR 选项 /S 递归列出所有指定目录和所有与文件模式匹配的子目录中的文件(并设置了存档属性)。

将每个文件名写入文件列表文件,然后从文件中删除存档属性,以便在批处理文件的下一个 运行 中自动忽略此文件,除了再次设置存档属性,因为同时修改了文件。

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

  • attrib /?
  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?

另请参阅 Microsoft 文章 Using command redirection operators,了解 >>2>nul 的解释,其中使用 ^ 转义 > 以在执行 DIR 而不是 FOR.