Войти

Показать полную графическую версию : Сравнение конечного количества файлов с начальным


Страниц : [1] 2

composter
13-12-2016, 15:35
Добрый день. я написал батник который обрабатывает файлы , после каждой обработки у файла появляется опроеделенный префикс соответвующий этапу обработки, если в какой то момент произошла ошибка обработки то он уже не поулчит нужный префикс и соответвенно не будет учавствовать в последующей обработки и в конце файлов которые прошли несколько ступеней обработки может быть меньше чем начальное количество. соответвсенно у меня вопрос как получить список тех файлов которые есть в начале но которых нет в конце обработки.
я так понимаю что начале можно записать файлы в лог
set log=%CD%\logfile.log
for /f "delims=" %%d in ('dir/b/od "%FILEPATH%\%FILEMASK0%"') do (>>%log% echo %%~nd )
а дальше что нужно делать?

Iska
13-12-2016, 15:56
composter, очень сумбурное описание.

composter
13-12-2016, 16:23
постараюсь по понянтнее. нужно получить первональный список файлов. дальше 2 варианта
-после обратботки получить список конечных файлов, сравнить их , если во 2 списке нет каких то файлов из 1, то создать 3 список и их туда добавить.
-после обработки сравить конечные файлы с 1 списком, и те файлы которые есть в папке вычеркнуть из 1 списка.

alpap
14-12-2016, 02:00
composter,
а обязательно списки нужны или чисто операции с файлами?

@echo off
set "d1=papka1"
set "d2=papka2"
for /f "delims=" %%a in ('dir/a-d/b "%d1%"') do if not exist "%d2%\%%a" echo copy ^(Копируем недостающие^) "%d1%\%%a" в "%d2%\"
echo Удаляем все совпадающие по имени файлы:
for /f "delims=" %%a in ('dir/a-d/b "%d2%"') do echo del "%d1%\%%a"
pause
.

composter
14-12-2016, 13:36
ну можно не списки ,а в переменную записать все названия файлов.
просто первоначальные файлы (они же файлы из 1 списка) во время 1 обработки переименовываются и файлов с таким именем не существует.

порпробовал ваш код
chcp 1251
set "d1=C:\333\444"
set "d2=C:\333\555"
for /f "delims=" %%a in ('dir/a-d/b "%d1%"') do if not exist "%d2%\%%a" echo copy ^(Копируем недостающие^) "%d1%\%%a" в "%d2%\"
echo Удаляем все совпадающие по имени файлы:
for /f "delims=" %%a in ('dir/a-d/b "%d2%"') do echo del "%d1%\%%a"
pause

вначале в папку 444 переместилл 6 файлов из них 4 в 555, потом наоборот - результат ничего не изменилось после запуска скрипта

alpap
14-12-2016, 15:11
composter,
а скрипт написан не для дет. сада и не является догмой, это инструмент, которым надо уметь работать. Поубирать echo для боевого запуска, убрать комментарий внутри условия.
Зачем браться за написание кодов, просить помощи, а самому не знать и не видеть банальных элементарных вещей. Делайте все руками, bat не для вас.

Iska
14-12-2016, 15:19
alpap, я бы не отказался, если бы Вы перевели мне на русский ТЗ, ибо я так толком и не понял озвученное.

composter
14-12-2016, 17:46
попробуюю еще раз.
в начале я имею файлы
1a.dwg
2a.dwg
3a.dwg
4a.dwg
5a.dwg
после первой опереации они переименовываются
___111___1a.dwg
___111___2a.dwg
___111___3a.dwg
___111___4a.dwg
___111___5a.dwg
после каждой поледущей операции у меня появляются файлы
___222___1a.dwg
___222___2a.dwg
___222___3a.dwg
___222___4a.dwg
___222___5a.dwg
в конце всех операций я перименовываю ихк начальному варианту , но дело в том что в результате ошибок у меня потются файлы и в конце может получиться
1a.dwg
4a.dwg
5a.dwg

соответвевенно мне нужно полчить список в котором будут отсутвующие файлы а в частности
2a.dwg
3a.dwg

если кому интересно то сейчас мой скрипт выгляди вот так

megaloman
14-12-2016, 18:12
composter, На фиг Зачем те списки, если в норме после обработки первый список должен быть пустым?
Я понимаю задачу так (рассматриваю на уровне отдельного файла):
батник
1. берёт в папке файл (хотелось бы знать маску файлов, чтобы при обработке не взять лишнего),
2. запускает обработку, после обработки файл переименовывается, исходный файл не хранится, что само по себе плохо. Кстати, обработанный файл остаётся в той же папке ?(что мне тоже не нравится). При сбое что происходит, переименованный файла не появляется а исходный файл уничтожается? или исходный остаётся на месте? А если сбой произошел, что делать? Принять к сведению и ничего не делать? Или надо разобраться с файлом и всё-таки его обработать?
Я уверен, что ваша задача разрешима без большого напряжения, но чётко распишите, что у вас происходит, то, что вам надо знать, какие файлы не обработаны, понятно, но ваши пассажи насчёт списков сбивают с толку.

composter
14-12-2016, 19:49
ну я думал разбить на разные части. но раз вы хотите могу вывалить все сразу.
обрабабатывается на всех этапах только 2 типа файлов *.dwg и *.dxf , на выходе остается только 1 тип файла *.dwg
содается список№1 (как я писал выше напиремер 1a.dwg , 2a.dwg, 3a.dwg , 4a.dwg ,5a.dwg)
у меня в каждом скрипте происходит обработка файла и замена префикса , например если было "___111___1a.dwg" то после обработки добавится файл "___222___1a.dwg"
если по каким то причинам произошла ошибка во время иполненися скрипта автокадом , то просто не появится файл "___222___1a.dwg , а значит в дальнейшей обработки он участвовать не будет .
в конце файлы переименовываются в исходные имена (просто убирается префикс).
еесли возникла при обработке ошибка , это значит что на выходе я получу 3(например) обработанных файла вместо 5(например).
создается список№2 (1a.dwg , 4a.dwg ,5a.dwg)
создается список№3 , недостающих файлов (2a.dwg, 3a.dwg )
значит мне нужно получить последнюю версию 2 файлов которые не доконца прошли обработку. допустим не прошли 2a.dwg и 3a.dwg, найти среди файлов *2a.dwg последний по дате файл и переименовать его в 2a.dwg , потом тоже самое сделать для 3a.dwg .
ну и в конце создать лог файл что файлы 2a.dwg и 3a.dwg прошли обработку не до конца (в идеале еще добавить аналз согласно последнему по времени префиксу)

на счет копирования/добавления префикса/складирования в одной папки это просто мое решение. если вы считаете что лучше подругому как то сделать то расскажите

composter
14-12-2016, 20:37
создаются файлы после обработки для того, чтобы в конце можно было понять что на какой то операции была ошибка, и провести эти действия в ручную.


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

Iska
14-12-2016, 20:38
если по каким то причинам произошла ошибка во время иполненися скрипта автокадом , то просто не появится файл "___222___1a.dwg , а значит в дальнейшей обработки он участвовать не будет . »
в конце файлы переименовываются в исходные имена (просто убирается префикс). »
Вместо переименовываний, которые только запутывают дело, я бы действовал иначе. Создали вложенную Папку1, обработали очередной файл на первом этапе — положили результат в неё. Создали рядом вложенную Папку2, обработали на втором этапе очередной файл из Папки1 — положили результат в неё. И так далее до получения конечного результата. Оригиналы могут быть либо сразу помещены в какую-нибудь папку Backup — если Вам обязательно получать результирующие файлы на месте старых оригиналов.

А в Вашем случае в результате получается мешанина из обработанных, полуобработанных и вовсе не обработанных файлов, и Вы потом судорожно пытаетесь с ними разобраться.

Я не знаю, что умеет и как именно работает скрипт AutoCad'а, обрабатывает ли он сам файл по месту или загружает файл в память, обрабатывает и затем записывает поверх (и может ли записать результат в новый файл), умеет ли он писать в текстовый файл (те самые логи), но я бы действовал так. В моём варианте можно как обрабатывать файлы скопом поэтапно, либо каждый файл зараз проводя его по всем этапам — ничего особо не изменится.

megaloman
14-12-2016, 21:09
composter, @Echo Off
cls

chcp 1251 >nul

Set "Pgm=C:\Program Files\Autodesk\AutoCAD 2014\accoreconsole.exe"
rem Set "Pgm=Z:\Test\test.bat"

Set "MaskIn=*.dwg"

Set "Pref1=___111___"
Set "Pref2=___222___"
Set "Pref3=___333___"
Set "Pref4=___444___"

Set "In=%CD%"

Set "OutBox=%CD%\_OutBox"

Set "Out1=puandau1.scr"
Set "Out2=todxf.scr"
Set "Out3=todwg.scr"
Set "Out4=puandau2.scr"

Set "Derr=%In%\_In_err"

md "%OutBox%" 2>nul
md "%Derr%" 2>nul

For /F "usebackq delims=" %%f IN (`Dir "%In%\%MaskIn%" /B /A:-D 2^>nul`) Do (
Copy "%In%\%%f" "%Derr%\" >nul
Move /Y "%In%\%%f" "%OutBox%\%Pref1%%%f" >nul
If Exist "%OutBox%\%Pref1%%%f" Call "%Pgm%" /i "%OutBox%\%Pref1%%%f" /s "%OutBox%\%Out1%" /l en-US
If Exist "%OutBox%\%Pref2%%%f" Call "%Pgm%" /i "%OutBox%\%Pref2%%%f" /s "%OutBox%\%Out2%" /l en-US
If Exist "%OutBox%\%Pref3%%%f" Call "%Pgm%" /i "%OutBox%\%Pref3%%%f" /s "%OutBox%\%Out3%" /l en-US
If Exist "%OutBox%\%Pref4%%%f" Call "%Pgm%" /i "%OutBox%\%Pref4%%%f" /s "%OutBox%\%Out4%" /l en-US
If Exist "%OutBox%\%%f" Del "%Derr%\%%f"
)
Как это работает:
Берётся исходный файл.
Копируется в папку для файлов, не прошедших обработку (Err).
Перемешается с префиксом 1 в папку с результатом (Out)
Далее последовательно вызывается обработчик, который делает последовательно в Out-папке из ранее обработанного файла файл с префиксом 2,3,4 и, наконец, с исходным именем (если я правильно понял логику работы вашего обработчика).
Если в Out - папке появился файл с исходным именем, то исходный файл в Err-папке удаляется.
Если нет - в Err папке сохраняется исходный файл, который можно обработать повторно, перенеся во входную папку ручками.

И так для всех файлов в исходной папке.
Какая радость от разделения папки с исходными файлами и результатом: можно несколько раз проводить обработку, не опасаясь навредить ранее обработанным файлам. Надеюсь, имена файлов уникальны? Иначе надо делать выходные папки с именами по времени обработки.

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

Наверное, рационально обработку делать в отличной от Out папке, например, Tmp, при этом в Out отправлять успешные файлы, а в Tmp- недообработанные. Но тут не проблема в доработке, мне надо понимать, полезно ли Вам то, что я Вам предлагаю.

Единственное, не очень понял, что делать с файлами в Out-папке с префиксами (то есть при обработке был сбой): удалять?
Доработать батник для работы с несколькими расширениями - это мелочь, труднее понять, что нужно.

composter
15-12-2016, 13:07
-Я не представляю размер Ваших файлов и насколько они Вам дороги, иначе я бы предложил создать архивную папку и складывать туда все исходные файлы после успешной обработки.
-ну размер файла dwg в среднем не более 10мб, размер dxf может достигать 100 мб. ну backup никогд не бвыает лишним )

-Единственное, не очень понял, что делать с файлами в Out-папке с префиксами (то есть при обработке был сбой): удалять?
-если все операции прошли удачно для файла то промежутоные результаты не нужны, если ошибка то нужен лишь последний вариант этого файла (с последним префиксом ну или последний по времени)

-Не томите, вываливайте как .dxf файл во время обработки становится .dwg. Всё из Вас надо под пыткой вытягивать
-при запуске скрипта todxf.scr происходит конветрация из dwg в dxf , при запуске todwg.scr -происходит обратное действие конвертация из dxf в dwg

megaloman
15-12-2016, 13:19
если все операции прошли удачно для файла то промежутоные результаты не нужны, если ошибка то нужен лишь последний вариант этого файла Не понимаю! Допустим, обработчик обрабатывает файл с префиксом 1. Что после обработки: только файл с префиксом 2 или файл 1 и 2? До сих пор у меня была иллюзия, что каждый последующий шаг обработки оставляет только последний файл. Если же все префиксные файлы остаются, то я бы предложил после каждого успешного шага убивать файлы с предыдущим префиксом. Как на самом деле обстоят дела? То есть при нормальной обработке никаких файлов с префиксами не должно остаться. Кстати, вас устроило то, что я наваял, или у меня артель "Напрасный труд"?

Iska
15-12-2016, 13:39
composter, используйте тэг «quote» для цитирования.

composter
15-12-2016, 14:15
на счет временных файлов, они должны удалятся. просто я изначально и спросил про списки, чтобы согласно им удалять полностью или частично согласно полученным спискам.

после каждой обработки по идее нужен новый префикс (чтобы в лог внести на какой стадии произошла ошибка), другое дело стоит ли создавать новый файл или просто переименовывать

Кстати, вас устроило то, что я наваял, или у меня артель "Напрасный труд"?
простите, был занят на работе. я очень ценю что мне помогаете .
сейчас протестил, прерывается после второго скрипта. там получается dxf файл после скрипта, а маска файлов только dwg / попробовал заменить на Set "MaskIn=*.dwg *.dxf" вообще не пошло.

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

composter
15-12-2016, 18:13
Исходный Файл.dwg
1. Первый шаг получаем ___111___Файл.dwg
2. Первый запуск accoreconsole.exe получаем ___222___Файл.dwg
3. Второй запуск accoreconsole.exe получаем ___333___Файл.dxf
4. Третий запуск accoreconsole.exe получаем ___444___Файл.dwg
5. Четвер запуск accoreconsole.exe получаем Файл.dwg

по поводу записи в лог ну вот запсукается строка
If Exist "%TmpBox%\%Pref3%%%f" Call "%Pgm%" /i "%TmpBox%\%Pref3%%%f" /s "%Out3%" /l en-US
в ней применяется скрипт к файлу ___333___ , если в предыдущем результате была ошибка , то будет файл ___222___ послдений и файл не найдет , значит нужно записать в лог что последняя версия файла ___222___ и имя файла

megaloman
15-12-2016, 22:05
@Echo Off
cls

chcp 1251 >nul

Set "Pgm=C:\Program Files\Autodesk\AutoCAD 2014\accoreconsole.exe"
REM Set "Pgm=Z:\Test\test2.bat"

Set "MaskIn=*.dwg"

Set "Pref1=___111___"
Set "Pref2=___222___"
Set "Pref3=___333___"
Set "Pref4=___444___"

Set "In=%CD%"

Set "OutBox=%In%\_Box_Out"
Set "TmpBox=%In%\_Box_Tmp"
Set "ErrBox=%In%\_Box_Err"

md "%OutBox%" 2>nul
md "%TmpBox%" 2>nul
md "%ErrBox%" 2>nul

Set "Out1=puandau1.scr"
Set "Out2=todxf.scr"
Set "Out3=todwg.scr"
Set "Out4=puandau2.scr"

Set "ErrLog=%Date%-%Time%"
Set "ErrLog=%ErrLog::=_%"
Set "ErrLog=%ErrLog:/=_%"
Set "ErrLog=%ErrBox%\~%ErrLog:,=.%_Err.Log"

FOR %%f IN ("%In%\%MaskIn%") DO (
Call :DelAll "%%f"

Copy "%%f" "%ErrBox%\" >nul
Move /Y "%%f" "%TmpBox%\%Pref1%%%~nxf" >nul

Call :Job "%TmpBox%\%Pref1%%%~nxf" "%TmpBox%\%Out1%"
Call :Job "%TmpBox%\%Pref2%%%~nxf" "%TmpBox%\%Out2%" "%TmpBox%\%Pref1%%%~nxf"
Call :Job "%TmpBox%\%Pref3%%%~nxf" "%TmpBox%\%Out3%" "%TmpBox%\%Pref2%%%~nxf"
Call :Job "%TmpBox%\%Pref4%%%~nxf" "%TmpBox%\%Out4%" "%TmpBox%\%Pref3%%%~nxf"

If Exist "%TmpBox%\%%~nxf" (
Del "%TmpBox%\%Pref4%%%~nxf"
Move /Y "%TmpBox%\%%~nxf" "%OutBox%\" >nul
Del "%ErrBox%\%%~nxf"
) Else (
Echo ----- Исходный файл "%%f" от %%~tf %%~zfb не обработан.>>"%ErrLog%"
Echo перемещен "%ErrBox%\%%~nxf" Промежуточные файлы:>>"%ErrLog%"
FOR %%i IN ("%TmpBox%\%Pref1%%%~nf.*") DO Echo "%%i" %%~ti %%~zib >>"%ErrLog%"
FOR %%i IN ("%TmpBox%\%Pref2%%%~nf.*") DO Echo "%%i" %%~ti %%~zib >>"%ErrLog%"
FOR %%i IN ("%TmpBox%\%Pref3%%%~nf.*") DO Echo "%%i" %%~ti %%~zib >>"%ErrLog%"
FOR %%i IN ("%TmpBox%\%Pref4%%%~nf.*") DO Echo "%%i" %%~ti %%~zib >>"%ErrLog%"
Echo -------------------------------------------------------------------->>"%ErrLog%"
)
)
GoTo :Eof

:DelAll
Del "%TmpBox%\%~n1.*" 2>nul
Del "%OutBox%\%~n1.*" 2>nul

Del "%TmpBox%\%Pref1%%~n1.*" 2>nul
Del "%TmpBox%\%Pref2%%~n1.*" 2>nul
Del "%TmpBox%\%Pref3%%~n1.*" 2>nul
Del "%TmpBox%\%Pref4%%~n1.*" 2>nul
GoTo :Eof

:Job
If Exist "%~dpn1.*" (
If Not "%~3"=="" Del "%~dpn3.*"
FOR %%i IN ("%~dpn1.*") DO (
Call "%Pgm%" /i "%%i" /s %2 /l en-US
)
)

alpap
16-12-2016, 04:01
если все происходит вокруг одного файла и требуется именно это:
то будет файл ___222___ послдений и файл не найдет , значит нужно записать в лог что последняя версия файла ___222___ и имя файла »
то при данных именах будет работать это:

@echo off

set "d=papka"
set "lf=log.txt"
set "snf=__333__Файл"& if not "%~1"=="" (set "snf=%~1") else (set/p "snf=Vvedite imja faila: ")

for /f "delims=" %%a in ('dir/a-d/b "%d%"^|find "__"') do @echo %%a|find "%snf%" && (call :#1 "%%a") || (call :#2 "%%a")
pause>nul& exit

:#1
>"%lf%" (echo Последняя версия файла: %~1)
exit/b

:#2
>"%lf%" (
echo Файл %snf% не найден
echo Последняя версия файла: %~1
)
exit/b




© OSzone.net 2001-2012