Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 4

Модерирует : KLASS, IFkO

evle (19-03-2008 19:44): Лимит страниц.
Задачи на bat-файлах 5
 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

Tipulatoid



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Вот кусок из моего батника. Он выдирает из файлов писем *.eml (обычные текстовые файлы), создаваемых The Bat, аттачи и скармливает их утилите base64, которая приводит их в первозданый вид.
 

Код:
echo.
echo Сохраняю решения Action1#.dau из импортированных писем.
echo Это займет некоторое время . . .
 
:: Определение файла настроек
set file=send.ini
 
:: %group_quan% задается раньше в батнике, обычно равно 7-8
 
for /l %%a in (1,1,%group_quan%) do (
   set group_num=%%a
   del /q !group_num!maillist.del 2>nul
   set mail1_adress=
   set mail2_adress=
   set mail3_adress=
   set mail4_adress=
   set mail5_adress=
   for /f "skip=2 delims=]=, tokens=5-9" %%a in ('find "[Group %%a team #" %file%') do (
         set mail1_adress=%%a
         set mail2_adress=%%b
         set mail3_adress=%%c
         set mail4_adress=%%d
         set mail5_adress=%%e
         (
            if defined mail1_adress echo !mail1_adress!
            if defined mail2_adress echo !mail2_adress!
            if defined mail3_adress echo !mail3_adress!
            if defined mail4_adress echo !mail4_adress!
            if defined mail5_adress echo !mail5_adress!
         )>>!group_num!maillist.del
   )
   for /f "skip=2 delims=] tokens=1*" %%a in ('find "[Group !group_num! mail name]" %file%') do (
      set mail_name=%%b
      if exist !group_num!maillist.del move /y !group_num!maillist.del "%CD%\Inbox\!mail_name!\" 2>nul
      if exist "%CD%\Inbox\!mail_name!" pushd "%CD%\Inbox\!mail_name!" 2>nul
 
      if exist *.eml (
         for /f %%a in ('dir *.eml /b /a:-d') do (
            for /f %%a in ('findstr /g:!group_num!maillist.del /m %%a') do (
               set eml_file=
               set eml_file=%%a
               for /f "skip=2 tokens=1-3 delims=[]=" %%a in ('find /i /n "Action" %%a') do (
                  set skipmore=
                  set skipmore=%%a
                  set action=
                  set action=%%c
                  set action=!action:~1,-1!
               )
               echo.
               chcp 866>nul
               echo Сохраняю решение !action! из %group_name% !group_num!
               chcp 1251>nul
               set first_empty_line=
               set second_empty_line=
               set counter=0
               for /f "tokens=1 delims=:" %%a in ('more +!skipmore! !eml_file! ^| findstr /r /v /n "."') do (
                  set /a counter+=1
                  if /i !counter! equ 1 set first_empty_line=%%a
                  if /i !counter! equ 2 set second_empty_line=%%a
               )
               set first_line=
               set second_line=
               set /a first_line=!skipmore!+!first_empty_line!
               set /a second_line=!second_empty_line!-6
               del /q !action!.del 2>nul
               call :detach !first_line! !eml_file! !action!.del !second_line!
               base64.exe -d !action!.del !action! 2>nul
               del /q !action!.del 2>nul
            )
         )
      )
      del /q !group_num!maillist.del 2>nul
      if exist "%CD%\Inbox\!mail_name!" popd
   )
)
goto :next_label
 
:detach
set count=0
for /f "tokens=*" %%a in ('more +%~1 %~2') do (
   set /a count+=1
   if /i !count! lss %~4 (
      echo %%a>>%~3
   ) else (
      echo %%a | find /i "-----" >nul && goto :eof
      echo %%a>>%~3
   )
)
goto :eof
 
:next_label
echo Next Label

 
В принципе код работает как надо, но дюже медленно; при этом проц нагружает на 100%. Основные тормоза возникают в виртуальном батнике :detach, когда аттач из eml-файла построчно переписывается в другой текстовый файл; а когда еще наступает проверка  конца аттача echo %%a | find /i "-----" >nul && goto :eof вообще медленно идет из-за find
 
Может, посоветуете идею по поводу ускорения? Может, совсем другой алгоритм следует применить?

Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 05:15 06-11-2007 | Исправлено: Tipulatoid, 05:37 06-11-2007
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 4
evle (19-03-2008 19:44): Лимит страниц.
Задачи на bat-файлах 5


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru