Войти

Показать полную графическую версию : автоматическое обновление справочников Биков ПО 01RKC#.exe


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

Anufriev
21-05-2012, 15:07
добрый день!

необходимо создать батник, который делает такое

1. по пути "C:\INFO\" имеется файл вида "readDDMM.001" (пример файла во вложении, кодировка DOS) где DD и MM день и месяц соответственно, в нем необходимо найти текст (имя файла) "*.arj" (* - постоянно меняется)
2. создать текстовый файл "get.txt" по пути "C:\БИКИ\get\" стекстом "get mfo *.arj"
3. из "C:\INFO\" файл "readDDMM.001" переместить в папку "C:\INFO\сегодняшняя дата в формате «год.месяц.число» (пример 2012.05.21)" (для того что бы повторно не прочитался файл)
4. сканировать папку "C:\BNK\IZM\" на появление архива "*.arj", его необходимо распаковать в туже папку
5. необходимо запустить досовское ПО по пути "C:\BNK\01RKC#.exe"
6.появится ошибка, необходимо кликнуть как то на «ignore»
7. закрыть ПО двойным нажатием "ESC"
8. на сетевом диске "Z:\" изменить имя папки "DAT" на нынешнюю дату в формате год.месяц.число (пример 2012.04.18)
9. скопировать папку "DAT" из "C:\BNK\" на сетевой диск "Z:\"
10. P.s. было бы не плохо сделать что бы он постоянно сканировал папку "C:\INFO\" на появление файла "readDDMM.001" и только когда появился файлик он начал те действия что описаны выше
11. отправить сообщение о завершении обновлений

получился очень хороший батник:

@Echo Off
rem Пути
Set ReadPath=C:\INFO
Set GetPath=C:\biki\get
Set ARJPath=C:\BNK\IZM
rem Таймаут проверки файлов, в секундах
Set Timeout=10

Set /A Timeout+=1
If Not Exist "%ReadPath%" Echo Error - Directory not found&Exit /B 1
rem Подготавливаем структуру директорий
If Not Exist "%GetPath%" MD "%GetPath%"

:Loop
Set ARJName=&Set NFOName=
rem Поиск файла
For /F "delims=" %%F In ('Dir "%ReadPath%\read*.*" /B') Do (
Set NFOName=%%F
rem Поиск в найденном строки с архивом
For /F "delims=" %%S In ('Findstr /R /I /C:"\<*.arj\>" "%ReadPath%\%%F"') Do (
rem Разбор строки на составляющие, вычленение имени архива
For %%A In (%%S) Do (
Echo %%A|Find /I "arj">nul&&Set ARJName=%%A
)
)
)
If Defined ARJName (
Echo Found %NFOName%, processing...
rem Создаем get-файл
Echo get mfo %ARJName%>"%GetPath%\get.txt"
rem Перемещаем обработанный файл, чтобы исключить повторное прочтение
rem Если в системе установлен другой формат даты - исправить.
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (
If Not Exist "%ReadPath%\%%C.%%B.%%A" MD "%ReadPath%\%%C.%%B.%%A"
Move "%ReadPath%\%NFOName%" "%ReadPath%\%%C.%%B.%%A\%NFOName%"
)
:WaitForARJ
rem Распаковка архива, или ожидание, если он ещё не появился
If Exist "%ARJPath%\%ARJName%" (
c:\arj\ARJ32.EXE e C:\BNK\IZM\*.arj C:\BNK\IZM\
Echo Archive %ARJName% successfuly extracted
rem Запускаем программу
Start "" "C:\BNK\01RKC#.EXE"
Ping -n 10 127.0.0.1>nul
taskkill /IM ntvdm.exe
rem Делаем бэкап баз
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (
If Not Exist "D:\%%C.%%B.%%A" (
Ren "y:\DAT" "%%C.%%B.%%A" 2>nul||MD "D:\%%C.%%B.%%A"
Xcopy "C:\BNK\DAT" "y:\DAT" /E /I /Y /Q
msg console /server:*.*.*.* "обновление завершено"
)
)
) Else (
Echo Waiting for ARJ in %ARJPath%
Ping -n %Timeout% 127.0.0.1>nul
GoTo WaitForARJ
)
)
rem Уход на новую итерацию после таймаута
Cls&Echo Scanning %ReadPath%...
Ping -n %Timeout% 127.0.0.1>nul
GoTo Loop

шестой пункт решается этим способом предложенным Iska

сделайте копии файла «config.nt», расположенного в папке «system32» Вашей папки «Windows», и файла «config.fp», расположенного в папке с приложением. Затем поменяйте в обоих вышеупомянутых файлах строку: FILES=40 на: FILES=200

Спасибо за помощь!

Iska
21-05-2012, 16:08
но мне сказали что VBS не умеет работать с текстом »
Вам солгали.

Anufriev
21-05-2012, 18:23
в таком случае я был бы очень благодарен, если бы мне помогли в написании этого скрипта

Anonymоus
21-05-2012, 22:25
Anufriev, установите приемлемый для вас таймаут сканирования, я по умолчанию 10 секунд поставил. Чтобы окошками черными прыгающими бухгалтеров не стращать, запускайте этот батник свернутым или вообще без видимого окна (поищите, есть утилиты для этого).
Команды распаковки arj-архива вставлять не стал, сами вставите, т.к. я не знаю, какой у вас архиватор там для этих целей.
Батник будет висеть и раз в %Timeout% секунд проверять наличие файлов\обрабатывать их.


@Echo Off
rem Пути
Set ReadPath=C:\INFO
Set GetPath=C:\БИКИ\get
Set ARJPath=C:\BNK\IZM
rem Таймаут проверки файлов, в секундах
Set Timeout=10

Set /A Timeout+=1
If Not Exist "%ReadPath%" Echo Error - Directory not found&Exit /B 1
rem Подготавливаем структуру директорий
If Not Exist "%GetPath%" MD "%GetPath%"
If Not Exist "%ReadPath%\old" MD "%ReadPath%\old"

:Loop
Set ARJName=&Set NFOName=
rem Поиск файла
For /F "delims=" %%F In ('Dir "%ReadPath%\read*.001" /B') Do (
Set NFOName=%%F
rem Поиск в найденном строки с архивом
For /F "delims=" %%S In ('Findstr /R /I /C:"\<*.arj\>" "%ReadPath%\%%F"') Do (
rem Разбор строки на составляющие, вычленение имени архива
For %%A In (%%S) Do (
Echo %%A|Find /I "arj">nul&&Set ARJName=%%A
)
)
)
If Defined ARJName (
Echo Found %NFOName%, processing...
rem Создаем get-файл
Echo get mfo %ARJName%>"%GetPath%\get.txt"
rem Переименовываем обработанный файл, чтобы исключить повторное прочтение
rem Если в системе установлен другой формат даты - исправить.
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (
Move "%ReadPath%\%NFOName%" "%ReadPath%\old\%%C.%%B.%%A_%NFOName%"
)
:WaitForARJ
rem Распаковка архива, или ожидание, если он ещё не появился
If Exist "%ARJPath%\%ARJName%" (
Здесь вставьте команды распаковки архива
Echo Archive %ARJName% successfuly extracted
) Else (
Echo Waiting for ARJ in %ARJPath%
Ping -n %Timeout% 127.0.0.1>nul
GoTo WaitForARJ
)
)
rem Уход на новую итерацию после таймаута
Cls&Echo Scanning %ReadPath%...
Ping -n %Timeout% 127.0.0.1>nul
GoTo Loop

Anufriev
22-05-2012, 08:34
огромное спасибо, все работает как швейцарские часики

p.s. сделал только пару изменений, ну и дописал команду распаковки архива

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


rem Подготавливаем структуру директорий
If Not Exist "%GetPath%" MD "%GetPath%"
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (
If Not Exist "%ReadPath%\%%C.%%B.%%A" MD "%ReadPath%\%%C.%%B.%%A


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


rem Переименовываем обработанный файл, чтобы исключить повторное прочтение
rem Если в системе установлен другой формат даты - исправить.
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (
Move "%ReadPath%\%NFOName%" "%ReadPath%\%%C.%%B.%%A\%NFOName%"


3. ну и команда arj


c:\arj\ARJ32.EXE e C:\BNK\IZM\*.arj C:\BNK\IZM\


и красота, все работает именно так как мне это и нужно, огромное человеческое спасибо:)

Anufriev
22-05-2012, 12:30
появилась проблемка, после вашего ответа в другой теме

в каком месте и что дописать в данном батнике, что бы запустить программу 01RKC#.exe после распаковки архива, если верить логике то перед частью которую я указал ниже, но возникает проблема, ПО не обращает внимание на весь остальной код, она в наглую берет и запускается даже если все остальное еще не выполнилось

rem Уход на новую итерацию после таймаута
Cls&Echo Scanning %ReadPath%...
Ping -n %Timeout% 127.0.0.1>nul
GoTo Loop

Anufriev
22-05-2012, 13:38
Поспешил с вопросом, сам разобрался:), еще раз спасибо огромное

Anufriev
23-05-2012, 06:13
замечен небольшой глюк:

запускаю батник, находит файл, создает папку здесь C:\INFO все хорошо, оставил его работать, прихожу сегодня с утра, файл он нашел, но вод папку 2012.05.23 он сегодня не создал и соответственно файл "readDDMM.001" туда не переместил, и начал по кругу создавать файл get.txt.

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

@Echo Off
rem Пути
Set ReadPath=C:\INFO
Set GetPath=C:\biki\get
Set ARJPath=C:\BNK\IZM
rem Таймаут проверки файлов, в секундах
Set Timeout=10

Set /A Timeout+=1
If Not Exist "%ReadPath%" Echo Error - Directory not found&Exit /B 1
rem Подготавливаем структуру директорий
If Not Exist "%GetPath%" MD "%GetPath%"
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (
If Not Exist "%ReadPath%\%%C.%%B.%%A" MD "%ReadPath%\%%C.%%B.%%A
)
:Loop
Set ARJName=&Set NFOName=
rem Поиск файла
For /F "delims=" %%F In ('Dir "%ReadPath%\read*.*" /B') Do (
Set NFOName=%%F
rem Поиск в найденном строки с архивом
For /F "delims=" %%S In ('Findstr /R /I /C:"\<*.arj\>" "%ReadPath%\%%F"') Do (
rem Разбор строки на составляющие, вычленение имени архива
For %%A In (%%S) Do (
Echo %%A|Find /I "arj">nul&&Set ARJName=%%A
)
)
)
If Defined ARJName (
Echo Found %NFOName%, processing...
rem Создаем get-файл
Echo get mfo %ARJName%>"%GetPath%\get.txt"
rem Переименовываем обработанный файл, чтобы исключить повторное прочтение
rem Если в системе установлен другой формат даты - исправить.
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (
Move "%ReadPath%\%NFOName%" "%ReadPath%\%%C.%%B.%%A\%NFOName%"
)
:WaitForARJ
rem Распаковка архива, или ожидание, если он ещё не появился
If Exist "%ARJPath%\%ARJName%" (
c:\arj\ARJ32.EXE e C:\BNK\IZM\*.arj C:\BNK\IZM\
Echo Archive %ARJName% successfuly extracted
) Else (
Echo Waiting for ARJ in %ARJPath%
Ping -n %Timeout% 127.0.0.1>nul
GoTo WaitForARJ
)
call 01RKC#.exe
)
rem Уход на новую итерацию после таймаута
Cls&Echo Scanning %ReadPath%...
Ping -n %Timeout% 127.0.0.1>nul
GoTo Loop

Anonymоus
23-05-2012, 07:13
Anufriev, директория с датой в этом батнике создается один раз, при запуске. А вы же его вчера запускали, верно? Дата сменилась, а директории нету, следовательно нужно проверять её наличие, и при необходимости создавать каждый раз, когда она будет востребована. Например, переносом проверки\создания в тот же цикл, который разбирает дату на составляющие и перемещает обработанный файл:

@Echo Off
rem Пути
Set ReadPath=C:\INFO
Set GetPath=C:\biki\get
Set ARJPath=C:\BNK\IZM
rem Таймаут проверки файлов, в секундах
Set Timeout=10

Set /A Timeout+=1
If Not Exist "%ReadPath%" Echo Error - Directory not found&Exit /B 1
rem Подготавливаем структуру директорий
If Not Exist "%GetPath%" MD "%GetPath%"

:Loop
Set ARJName=&Set NFOName=
rem Поиск файла
For /F "delims=" %%F In ('Dir "%ReadPath%\read*.*" /B') Do (
Set NFOName=%%F
rem Поиск в найденном строки с архивом
For /F "delims=" %%S In ('Findstr /R /I /C:"\<*.arj\>" "%ReadPath%\%%F"') Do (
rem Разбор строки на составляющие, вычленение имени архива
For %%A In (%%S) Do (
Echo %%A|Find /I "arj">nul&&Set ARJName=%%A
)
)
)
If Defined ARJName (
Echo Found %NFOName%, processing...
rem Создаем get-файл
Echo get mfo %ARJName%>"%GetPath%\get.txt"
rem Перемещаем обработанный файл, чтобы исключить повторное прочтение
rem Если в системе установлен другой формат даты - исправить.
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (
If Not Exist "%ReadPath%\%%C.%%B.%%A" MD "%ReadPath%\%%C.%%B.%%A"
Move "%ReadPath%\%NFOName%" "%ReadPath%\%%C.%%B.%%A\%NFOName%"
)
:WaitForARJ
rem Распаковка архива, или ожидание, если он ещё не появился
If Exist "%ARJPath%\%ARJName%" (
c:\arj\ARJ32.EXE e C:\BNK\IZM\*.arj C:\BNK\IZM\
Echo Archive %ARJName% successfuly extracted
) Else (
Echo Waiting for ARJ in %ARJPath%
Ping -n %Timeout% 127.0.0.1>nul
GoTo WaitForARJ
)
call 01RKC#.exe
)
rem Уход на новую итерацию после таймаута
Cls&Echo Scanning %ReadPath%...
Ping -n %Timeout% 127.0.0.1>nul
GoTo Loop

Кстати, если 01RKC#.exe вызывается только после распаковки архива, то логичнее бы было перенести запуск этой программы в то самое условие, в котором архив и распаковывается. Например, сразу после строки "Echo Archive %ARJName% successfuly extracted"

Anufriev
23-05-2012, 07:57
спасибо, проверил методом изменения дат во время работы батника, теперь работает прекрасно!

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

мне необходимо после запуска C:\BNK\01RKC#.EXE через 2 секунды нажать на клавишу I и еще через 2 секунды необходимо нажать два раза "Esc"

Anonymоus
23-05-2012, 08:11
"Справочник БИК" у меня не установлен, поэтому проверить код не на чем, так что попробуйте у себя вот это:

@Echo Off
:: Запускаем программу
Start "" "C:\BNK\01RKC#.EXE"
:: Ждём две секунды
Ping -n 3 127.0.0.1>nul
:: Делаем окно программы активным (по заголовку окна, поменяйте на реальный заголовок)
Nircmdc win focus ititle "Заголовок"
:: Посылаем нажатие 'I'
Nircmdc sendkeypress I
:: Ещё раз ждём две секунды
Ping -n 3 127.0.0.1>nul
:: Посылаем двойное нажатие 'ESC'
Nircmdc sendkeypress esc esc

Iska
23-05-2012, 09:21
Anonymоus, а почему не ждёте самим NirCmd? Там аж целых две возможности, как «wait», так и более удобная в нашем случае «cmdwait».

Anufriev
23-05-2012, 09:24
судя по всему, должно с вот этим заголовком "ntvdm*" все работать, сейчас на скриншоте заголовок "ntvdm-ed8.444.35c" где ntvdm - постоянная, -ed8.444.35c - постоянно меняется, но почему то не работает:(

Anonymоus
23-05-2012, 09:44
Iska, как-то из головы вылетела такая возможность. Вы правы, раз уж nircmd используется, глупо не сделать паузу через него.

Anufriev, немного поправил, проверьте вот этот скрипт

@Echo Off
:: Запускаем программу
Start "" "C:\BNK\01RKC#.EXE"
:: Ждём две секунды и делаем окно программы активным
Nircmdc cmdwait 2000 win activate stitle "ntvdm"
:: Посылаем нажатие 'I'
Nircmdc sendkeypress I
:: Ещё раз ждём две секунды и посылаем двойное нажатие 'ESC'
Nircmdc cmdwait 2000 sendkeypress esc esc

Anufriev
23-05-2012, 09:58
так, активным окно делается, а вот нажатие клавиш не передается

Iska
23-05-2012, 10:01
«Too many fies open» — не проще ли настроить количество доступных для подсистемы файлов? Anufriev, дайте прямую ссылку на «01RKC#.EXE», откуда его можно загрузить.

Anufriev
23-05-2012, 10:08
прошу (http://cbr.bankir.ru/bic/bic_new.zip)

но сообщение ignore выскакивает только в случае обновления

Iska
23-05-2012, 12:58
Anufriev, сделайте копии файла «config.nt», расположенного в папке «system32» Вашей папки «Windows», и файла «config.fp», расположенного в папке с приложением.

Затем поменяйте в обоих вышеупомянутых файлах строку:
FILES=40
на:
FILES=200

Перезагрузите машину (на всякий случай, я не помню, требуется ли сие реально) и попробуйте обновить — появится ли вновь ошибка «Too many fies open»?

Anufriev
23-05-2012, 13:42
прекрасно, ошибка больше не выскакивает

осталась теперь последняя проблемка, это необходимость закрыть программу, а для этого необходимо двойное нажатие "esc"

p.s. перезагрузка не потребовалась!

можно сделать вод так

taskkill /IM ntvdm.exe

Iska
23-05-2012, 14:00
p.s. перезагрузка не потребовалась! »
Спасибо, ясно.




© OSzone.net 2001-2012