Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сравнение конечного количества файлов с начальным

Ответить
Настройки темы
CMD/BAT - Сравнение конечного количества файлов с начальным

Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:35, 13-12-2016

 

Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


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


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

Отправлено: 20:37, 14-12-2016 | #11



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 20:38, 14-12-2016 | #12


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


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-папке с префиксами (то есть при обработке был сбой): удалять?
Доработать батник для работы с несколькими расширениями - это мелочь, труднее понять, что нужно.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 14-12-2016 в 21:22.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:09, 14-12-2016 | #13


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 13:07, 15-12-2016 | #14


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 13:19, 15-12-2016 | #15


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


composter, используйте тэг «quote» для цитирования.

Отправлено: 13:39, 15-12-2016 | #16


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

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

Отправлено: 14:15, 15-12-2016 | #17


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Исходный Файл.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___ и имя файла

Последний раз редактировалось composter, 15-12-2016 в 18:14. Причина: забыл дописать


Отправлено: 18:13, 15-12-2016 | #18


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Обработка файлов ведётся в папке TMP, успешный результат помещается в OUT, промежуточный сбойный результат остаётся в TMP, исходный сбойный файл помещается в ERR. При обработке промежуточные файлы могут иметь расширение, отличное от исходного. При неуспешной обработке создаётся лог-файл с указанием наличия файлов.
Код: Выделить весь код
@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
		)
	)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 22:05, 15-12-2016 | #19


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


если все происходит вокруг одного файла и требуется именно это:
Цитата composter:
то будет файл ___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

Отправлено: 04:01, 16-12-2016 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сравнение конечного количества файлов с начальным

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Подсчет количества ini файлов в папке XXXp Скриптовые языки администрирования Windows 14 10-04-2012 02:06
CMD/BAT - [решено] Счетчик количества файлов Arsenik77 Скриптовые языки администрирования Windows 1 28-08-2011 11:13
CMD/BAT - Перемещение в папку определенного количества файлов Arsenik77 Скриптовые языки администрирования Windows 1 18-07-2011 17:11
Интерфейс - [решено] Переименование большого количества файлов 7human7 Microsoft Windows 2000/XP 7 22-11-2008 09:48
Проблема с начальным пакетом... markizzz Хочу все знать 2 12-10-2003 18:46




 
Переход