2016-04-26 4 views
0

У меня есть папка для посадки, в которой мы получаем 10-15 файлов каждый день. Затем я запускаю пакетный скрипт для создания списка с именами файлов, которые были недавно выгружены, а затем informatica читает список имен файлов для обработки новых исходных файлов.пакетный скрипт для генерации списка с именами файлов, более поздними, чем сохраненная дата timestamp

Проблема заключается в том, если файл редактируется в тот же день после того, как informatica загружает файл. Мой пакетный скрипт не идентифицирует обновленный файл, так как файл имеет такую ​​же дату и имя.

Есть ли способ сравнить файлы на основе timestamp и сгенерировать список файлов? Любая помощь будет оценена. Благодаря! текущий код пакетного сценария:

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% 

ответ

1

В Windows есть архив атрибут всегда устанавливается на файл автоматически, если файл модифицирован каким-либо образом.

Использование атрибута файла архива делает задачу намного проще, чем сохранение файлов последних изменений во время обработки всех файлов и сравнение времени последнего изменения файла в следующем прогоне.

Все, что нужно сделать, - это удаление атрибута архива при уже обработанном файле, то есть добавлении в список файлов.

Пример:

@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 возвращается из-за /AA-D всего файлов (не каталоги) с архива набор атрибутов в голого формате из-за /B.

Так выход на DIR и обрабатывается ДЛЯ просто имена файлов с атрибутом архивный набор без пути и всегда без окружающих двойных кавычек, даже если имя файла содержит пробел или другой специальный символ.

имена файлов будут возвращены на DIR с полным путем на использовании дополнительно DIR вариант /S для перечисления рекурсивно все файлы в указанном каталоге и во всех подкаталогах, соответствующих шаблону файла (и имеющих набор атрибутов архив).

Каждое имя файла записывается в файл списка файлов, а затем из файла удаляется атрибут архива, чтобы автоматически игнорировать этот файл при следующем запуске командного файла, за исключением того, что атрибут архива снова установлен, поскольку файл был изменен в То время.

Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

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

Смотрите также статью Microsoft Using command redirection operators для объяснения >> и 2>nul вытекания > с ^ быть интерпретированы на выполнение DIR вместо ДЛЯ.

 Смежные вопросы

  • Нет связанных вопросов^_^