2017-01-18 14 views
2

наша программа ERP создает .zip-файлы, содержащие XML-документы. Мне нужно убедиться, что каждый .zip-файл извлечен в папку назначения. я нашел пакетный сценарий, который сравнивает два файла журнала, но я не могу понять, как обрабатывать новый (еще не распакованные) файлыпакетный просмотр папки и распаковка каждого файла

@echo off 
    if not exist c:\OldDir.txt echo. > c:\OldDir.txt 
    dir /b "C:\Spektra\Gelen" > c:\NewDir.txt 
    set equal=no 
    fc c:\OldDir.txt c:\NewDir.txt | find /i "no differences" > nul && set equal=yes 
    copy /y c:\Newdir.txt c:\OldDir.txt > nul 
    if %equal%==yes goto :eof 
    rem Your batch file lines go here 
    ********** 
    c:\unzip.exe (the_new_files) -d (destination) 
    ******************* 

здесь сценарий

мне нужно обрабатывать новые файлы, которые дон «т существуют на старом файле журнала

благодаря

+0

Я бы пойти другим путем. Атрибут архива, скорее всего, установлен для всех новых файлов. Поэтому я бы просто перечислил файлы, у которых установлен атрибут архива, и разархивируйте эти файлы. Когда вы закончите распаковывать файл, используйте команду 'attrib', чтобы отключить атрибут архива. Для начала вам потребуется определенная настройка. Любые файлы, которые уже были распакованы, вам нужно будет отключить атрибут архива. – Squashman

+0

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

ответ

1

чтобы узнать, какие строки были добавлены в новый файл журнала C:\NewDir.txt относительно старого один OldDir.txt вы можете использовать findstr command, в котором есть опция /G, чтобы указать файл, содержащий строки поиска. Вместе с /X (точным совпадением) и /V (возврат несоответствующих линий), только те строки NewDir.txt возвращаются, которые были добавлены, предположит, каждую строку уникально:

findstr /V /X /I /G:"C:\OldDir.txt" "C:\NewDir.txt" 

Для обработки возвращенных предметов, используйте for /F loop захватить их:

for /F "eol=| delims=" %%F in (' 
    findstr /V /X /I /G:"C:\OldDir.txt" "C:\NewDir.txt" 
') do (
    rem // Do whatever you want with each file in `%%F`... 
) 

Так что ваш сценарий может выглядеть следующим образом:

@echo off 
rem // Change to the working directory `C:\` once: 
pushd "C:\" || exit /B 1 & rem/ ("C:\" is the root directory of drive "C:") 
rem // Ensure `OldDir.txt` exists by appending nothing: 
>> "OldDir.txt" rem/ 
rem // Create new log file `NewDir.txt`: 
> "NewDir.txt" dir /B "C:\Spektra\Gelen" 
rem // Process all newly added items in `NewDir`: 
for /F "eol=| delims=" %%F in (' 
    findstr /V /X /I /G:"OldDir.txt" "NewDir.txt" 
') do (
    rem // Do whatever you want with each file in `%%F`: 
    unzip "%%F" -d "C:\some\destination\folder" 
) 
rem // Move new log file onto old one, suppress report message: 
> nul move /Y "NewDir.txt" "OldDir.txt" 
rem // Restore previous working directory: 
popd