|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
||||||||||||||||
Перевести код из BAT в PB: оптимизация кода27.10.2012, 18:17. Показов 6814. Ответов 29
Метки нет (Все метки)
Здравствуйте, всем. Прошу помощи у знатоков. Пытаюсь перевести bat->pb, но не очень-то и получается. Честно пытался, но так и не получилось обойтись без оператора goto. Если кто сможет помогите новичку с переводом.
вот код нормально работающего bat'ника: ***************************************
**************************************** *******
пути подставил другие для проверки. сейчас код выглядит кусками. как его можно причесать/упростить (в частности проверки существования каталогов). В bat'нике эта проверка занимает буквально одну строчку. P.S. Прошу прощения за развернутый вид сообщения. не ознакомился пока с тэгами этого форума. Добавлено через 4 часа 31 минуту Извините за 2 сообщения подряд, не нашел где можно отредактировать свой предыдущий пост. Хотелось бы уточнить, что проблема с goto не стОит так остро, как акцентировал Памирыч переименовав тему. Скорее как оптимизация кода, если возможно. А вопрос собственно был в том, как мне лучше этот код завершить согласно приложенному выше батнику (поиск процесса, его "прибивание"). Очевидно же, что концовка совсем скомкана и неполная (без обид). Добавлено через 40 минут P.S. Совсем забыл, сказать, что robogrib.exe - есть консольное приложение не имеющее графической оболочки, которое является ни чем иным как robocopy.exe из resourcekit'a 2003(переименовывал потому как нужно было запускать две копии, а "прибивать" по имени было сподручнее). Своего рода синхронизатор 2х папок это у меня, одна из которых сетевая. Надеюсь я смог донести до вас суть программы. Также там замешан так называемый будильник, по которому происходит детект начала новых суток и соответственно переключение каталога "истоника" и "объекта". Добавлено через 13 часов 5 минут Уже 91 человек посмотрели, а ответов ровно как и вопросов нет ![]() Может нужны какие дополнительные комментарии по батничку? так вы спросите. Строки 2 и 3 были добавлены дабы избежать повторного запуска программы. Добавлено через 10 часов 29 минут Никак не возьму в толк. Здесь не могут ответить или не хотят? ![]() чуточку добавил кода.
0
|
||||||||||||||||
| 27.10.2012, 18:17 | |
|
Ответы с готовыми решениями:
29
Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода |
|
Кормпилятор
|
||
| 28.10.2012, 16:35 | ||
Ответить могут все, тут куча спецов, но от человека это потребует кучу времени просидеть над вашей задачей, думаем и делаем выводы. Поверьте, все вас очень понимают, но никто столько времени тратить не будет, спрашивайте по существу и просите помощи по небольшим участкам кода. Также не отвечают подозреваю, потому что не все знают формат *bat.*, за ненадобностью оного.
0
|
||
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 28.10.2012, 20:47 [ТС] | |
|
>Quiet Snow<, хорошо. Вас понял. Попробую по-существу спросить. Меня интересует следующее:
в своем коде 57й строкой я запускаю консоль cmd.exe, а вместе с ней и приложение robocopy.exe. Внимание вопрос: как мне не закрывая консольного окна "прибить" процесс robocopy.exe для того чтобы потом его снова запустить в этом же окне, но уже соответственно с другими параметрами (в частности немного изменится путь(день), например был ...\...\D01, стал ...\...\D02). Сейчас же реализовано через закрытие программы (строка 88 - KillProgram...). Пробовал и через KillProcess(PID). Все равно закрывает окно. В целом, что не нравится: открывается каждый раз в произвольном месте экрана, каждый раз переводит фокус на себя, когда должно работать в фоне. И хотелось бы знать как можно задать заголовок (title) консольного окна. Вот, пока только эти 2 вопроса меня интересуют, но первый важнее. Если это возможно, то подскажите пожалуйста как это сделать. У самого не получается реализовать.
0
|
|
|
|
|||
| 28.10.2012, 21:29 | |||
|
ConsoleTitle(Title$) - или вам изменить заголовок чужой консоли?
0
|
|||
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 29.10.2012, 21:43 [ТС] | |
|
Pro_grammer, в том-то и дело, что нужно заменить заголовок чужой консоли. сейчас он так и выглядит c:\robogrib.exe. #PB_Program_Hide не спасет, так как программа каждый раз перезапускается заново, потому что не выходит по-другому (с процессами). Полагаю принцип должен быть такой: 1) запуск консоли (cmd.exe); 2) Задать заголовок окна; 3) в этом же самом окне запустить процесс robogrib.exe. Как прозвенел будильник - убить процесс robogrib.exe, окно консоли при этом остается открытым. Затем считывание даты, присваивание ее переменной. Запуск процесса robogrib.exe. В качестве параметра выступает вышеобозначенная переменная пути. ВНИМАНИЕ! Запуск процесса robogrib.exe должен быть в том же самом dos-окне.
Добавлено через 26 минут P.S. окно консоли должно быть видимым, не скрытым, НО работать в фоне.
0
|
|
|
|
|
| 29.10.2012, 22:31 | |
|
А robocopy.exe работает сам по себе, без установки всего громадного и ненужного мне Resource Kit?
Если да, то скинте мне его, можно через файлообменник какой нибудь(http://rghost.ru/). Просто мне кажется, что мы с вами на разных языках говорим, вы ставите себе ненужные и лишние задачи. Возможно это оправдано в ограниченном возможностями .bat, но PB имеет всё для работы с консольным приложением. В том числе и управление и перенаправление ввода-вывода. Не вижу причин переименовывать консоль, к примеру. Зачем надо видеть консоль? Какой будильник должен звенеть? Зачем убивать процесс, если есть цивилизованный способ выхода из программы? И т.п. вещи.
0
|
|
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 30.10.2012, 10:26 [ТС] | |
|
Pro_grammer, здравствуйте. Да, robocopy.exe может работать сам по себе, вот ссылка на файлообменник http://rghost.ru/41230006. Мне тоже так кажется. Потому и спрашиваю чтобы лучше узнать о возможностях PB. Консоль необходимо видеть для контроля процесса. robocopy.exe - это консольное приложение и результаты своей работы выводит соответственно также в консоль. Относительно "будильника": если Вы обратили внимание то в цикле loop идет считывание текущего времени и сравнение его с заданным (4:00) каждые 15 мин. В дополнение производится операция вычитания от текущего времени по одной минуте. Это на случай если очередная проверка времени перескочит через заданный срок. Я с удовольствием Вас выслышаю насчет цивилизованного способа.
Добавлено через 3 минуты P.S. цикл вычитания работает 14 раз, так как период между проверками составляет 15 мин.
0
|
|
|
|
||||||
| 30.10.2012, 11:03 | ||||||
|
С robocopy.exe разобрался, работает утилита без комплекта.
Не могу понять что делает этот кусок кода
У меня сложилось стойкое мнение, что весь код уложится в 10 строчек и без GoTo конечно же. Добавлено через 5 минут Т.е копирование должно происходить раз в сутки в 4.00? А интересные параметры /MON:1 /MOT:10 Они же предназначены для постоянного мониторинга. Т.е программа ни когда не остановится - это вам зачем? Или если это надо, то зачем запускать раз в сутки? Что то не стыкуется. Добавлено через 11 минут Ещё не понял, почему мы создаем исходную папку, с которой идет копирование? Если её не было, она же пустая?
0
|
||||||
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 30.10.2012, 12:47 [ТС] | |
|
Pro_grammer, okay. Попробую рассказать еще более развернуто. итак, по-порядку:
объявляются константы hnday (hour next day) и mnday (minuts next day). Затем переводим все время в одни единицы - секунды. Далее считываем текущее время (часы и минуты) и также переводим в секунды. Полученное значение присваиваем переменной nowtime. Далее проверяется существование пути формата, к примеру сегодня это C:\IRAM\ARX_GRIB\G2012\M10\D30. Примерно так. Если бы Вы запустили приложенный батник, то увидели бы, что в одном консольном окне фактически протекают два процесса. Один - непосредственно robogrib.exe, а второй - это проверка наступления новых суток, которые начинаются не в 0:00, а в 4:00. MON1 - хотя бы одно изменение в источнике, MOT10 - период проверки источника на наличие хотя бы одного изменения. Проверка наступления же новых суток производится один раз в 15 мин. И как только они (новые сутки) настали процесс robogrib.exe перезагружается с новыми параметрами. Параметром для robogrib.exe является путь. Изменившейся путь. Верно? Ведь день-то изменился аж в 0:00. Так? Следовательно и каталог источник также нужно переключить. Верно, программа robogrib.exe перезапускается только при условии наступления новых суток. Устественно с новыми/изменившимися параметрами. Запускать раз в сутки как раз-таки для того, чтобы изменить параметры запуска. Как я уже сказал выше изменяющимися параметрами для robogrib.exe является путь. Так что все стыкуется. Папку необходимо создавать, чтобы источник существовал. А как иначе. Такая ситуация может сложиться, когда данные из рабочей программы задерживаются. Вот и приходится создавать каталог самому. Да. Она будет пустая, но это только до поры, до времени. Через некоторое время туда начнут сыпаться данные, и начнется процесс синхронизации. Примерно такая вот логика.
0
|
|
|
|
|||||||
| 30.10.2012, 17:33 | |||||||
|
Смена суток в 4.00 Ок, попробую. Добавлено через 4 часа 17 минут Вот такой набросок получился. Это не конечная программа - нет нормального вывода данных ( в дебаг пока), и даже нет выхода из программы ( в следствии чего последний экземпляр robocopy.exe остаётся работать в процессах). Но принцип работы думаю ясен.
1
|
|||||||
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 30.10.2012, 21:07 [ТС] | |
|
верно. прога должна работать круглосуточно. с процедурой более-менее понятно, а цикл неясен. спасибо конечно, но немного не то. хорошо, попробую спросить так. допустим запустил я cmd.exe вот так RunProgram("cmd.exe ","","",#PB_Program_Open). могу ли я после его запуска каким-то образом передавать через стандартный ввод/вывод (stdin-stdout) либо другим способом команды в досовском синтаксисе именно этой копии командного процессора? как Вы выше создавали директории. или это можно сделать разово, только при запуске с ключиком /с ? как из pb передать "досовскую" команду в ранее запущенную консоль?
0
|
|
|
|
|||||||
| 30.10.2012, 21:23 | |||||||
1
|
|||||||
|
|
|||||||
| 30.10.2012, 21:33 | |||||||
В сутках 1 раз бывает 0 часов - как наступает ставим флаг 1. Далее, как только наступает 4 часа мы убиваем старый robocopy и запускаем новый с новыми папками. При этом сбрасываем флаг новых суток на 0. Если этого не сделать, то целый час (до 5) будет происходить перезагрузка robocopy. Как только опять наступит 0 , флаг опять будет 1 и процедура перезагрузки повторится в 4 часа. Это гораздо проще, чем контролировать будильники по 15 минут! Соответственно нет необходимости в присутствии окна консоли. Если всю информацию записывать в файл, или в окно своей программы, которая может сидеть в трее и не мешать. Вариантов масса - и самый лучший это написать свой GUI к этой консольке, с понятными настройками, легким управлением.
1
|
|||||||
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 31.10.2012, 10:25 [ТС] | |
|
locm, да. Именно это меня и интересовало. Только, есть ли возможность не отображать в консоли передаваемые ей команды?
Pro_grammer, спасибо. Принцип Вашего примера понятен. Пока что нахожусь на стадии знакомства с PB, от того и вопросы. Возможно Вы правы и стоит действительно пересмотреть свой код, но это уже после решения задачи первостепенной важности, а именно запустить все как было задумано изначально. Самые грабли, во что уперся - это как раз и есть реализация через PB "досовских" команд "start /b" и "taskkill...". чтобы убивать процесс, а консолька при этом не закрывалась. Если получится, то покажу про что я спрашивал Вас все это время. Может быть у Вас найдется более красивое решение.
0
|
|
|
|
||||||
| 31.10.2012, 11:38 | ||||||
|
Dimk@, посмотрите этот код.
0
|
||||||
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 31.10.2012, 13:03 [ТС] | |
|
locm, бррр-рр-р. если я правильно Вас понял, то вышеприведенный пример делает следующее (давайте так. я попробую прокомментировать, а Вы если что-то неправильно поправите меня):
1. запуск cmd.exe с флажками/возможностью а) обмен между программами (запущенной и запускающей); б) возможность подключения к выходу запускаемой программы (считывание результатов ее работы); в) возможность подключения ко входу запускаемой программы (посылка данных запущенной программе в процессе работы запущенной программы). 2. если запущенная программа (cmd.exe) обнаружена, то запустить консольное приложение telnet.exe c ключом "?" (то есть выдать справку по данной програамке), НО... ответ выдать в окно ранее запущенной консоли, что становится возможным после установки флага #PB_Program_Connect,ID (ID указывает куда выводить результат выполнения telnet.exe /?). 3. если программа (telnet.exe) запущенна, то выдержать паузу в 2 сек. и завершить работу программы (telnet.exe). В итоге получается, что telnet.exe запускается на какие-то доли секунды, что незаметно для человеческого глаза. 4. далее следует попытка подключения к данному ПК. Результат работы также выводится в изначально запущенную консоль. Далее также следует проверка на предмет запущенности telnet.exe -> пауза 2 сек. -> закрытие программы telnet.exe -> конец работы. Если все так и есть, то это немного не то. потому как мне необходимо передавать КОМАНДЫ cmd.exe, делая их невидимыми (по типу @echo off), а не результат выполнения консольного приложения. Это немного разные вещи, если не ошибаюсь.
0
|
|
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 31.10.2012, 20:01 [ТС] | |
|
locm, хорошо. Вас понял. сейчас на работе и поэтому нет возможности нормально протестировать весь код в полном объеме. вечером прийду домой, еще раз пересмотрю все и тогда уже точно скажу, что не получается выполнить.
Добавлено через 5 часов 17 минут Pro_grammer, locm, вроде добился чего-то похожего. надо поставить на прогон и посмотреть что из этого получится. теперь у меня такой вопрос: как можно файл robocopy.exe вмонтировать в скомпилированный exe (как ресурс)? будет ли он извлекаться на диск при запуске программы и самое главное где? если да, то можно ли сделать так чтобы он извлекался рядом с программой, чтобы не зависеть от путей. Не важно где будет расположена программа. при работе она всегда обнаружит рядом с собой robocopy.exe.
0
|
|
|
|
||||
| 31.10.2012, 20:32 | ||||
|
0
|
||||
|
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
|
|
| 31.10.2012, 20:48 [ТС] | |
|
locm, можно простенький пример с IncludeBinary + без извлечения на диск.
0
|
|
| 31.10.2012, 20:48 | |
|
Помогаю со студенческими работами здесь
20
Оптимизация кода. Замер времени выполнения части кода. Перевести в код Pascal ABC из кода Pascal Delphi
В ярлыках браузеров emorhc.bat rehcnual.bat xoferif.bat erolpxei.bat Можно ли перевести BAT в VB6? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|