Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/33: Рейтинг темы: голосов - 33, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13

Перевести код из BAT в PB: оптимизация кода

27.10.2012, 18:17. Показов 6814. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, всем. Прошу помощи у знатоков. Пытаюсь перевести bat->pb, но не очень-то и получается. Честно пытался, но так и не получилось обойтись без оператора goto. Если кто сможет помогите новичку с переводом.

вот код нормально работающего bat'ника:
***************************************

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@echo off
tasklist /v /fi "WINDOWTITLE eq GRIB" | findstr "GRIB" 2>nul && exit
cls
 
title GRIB
tasklist | find /i "robogrib.exe" || goto runproc
taskkill /F /IM "robogrib.exe" /T
cls
sleep 3
goto runproc
 
:start
taskkill /F /IM "robogrib.exe" /T
cls
sleep 3
set folder=IRAM\ARX_GRIB\G%date:~6,4%\M%date:~3,2%\D%date:~0,2%
if exist D:\%folder% goto ok
mkdir D:\%folder%
 
:ok
start /b robogrib.exe D:\%folder% \\Sadis\%folder% *.dat /PURGE /MON:1 /MOT:10
goto loop
 
:runproc
set htime=%time:~0,2%
set mtime=%time:~3,2%
if %mtime%==08 set mtime=8
if %mtime%==09 set mtime=9
set den=%date:~0,2%
if %den%==08 set den=8
if %den%==09 set den=9
set hnday=4
set mnday=00
set /a nowtime=(%htime% * 3600)+(%mtime% * 60)
set /a nexttime=(%hnday% * 3600)+(%mnday% * 60)
if %nowtime% LSS %nexttime% goto changed
set folder=IRAM\ARX_GRIB\G%date:~6,4%\M%date:~3,2%\D%date:~0,2%
goto begin
 
:changed
set /a den=den-1
if %den% EQU 0 set folder=IRAM\ARX_GRIB\G%date:~6,4%\M%date:~3,2%\D01 && goto begin
if %den% LSS 10 set folder=IRAM\ARX_GRIB\G%date:~6,4%\M%date:~3,2%\D0%den% && goto begin
set folder=IRAM\ARX_GRIB\G%date:~6,4%\M%date:~3,2%\D%den:~0,2%
 
:begin
if NOT exist D:\%folder% mkdir D:\%folder%
start /b robogrib.exe D:\%folder% \\Sadis\%folder% *.dat /PURGE /MON:1 /MOT:10
 
:loop
sleep 900
set htime=%time:~0,2%
set mtime=%time:~3,2%
if %mtime%==08 set mtime=8
if %mtime%==09 set mtime=9
set /a nowtime=(%htime% * 3600)+(%mtime% * 60)
 
for /l %%i in (1,1,14) do call :G1
goto loop
 
:G1
if %nowtime%==%nexttime% goto start
set /a nowtime=nowtime-60
if %nowtime%==%nexttime% goto start
goto :eof
А это код на pb (все, что более-менее удалось):
**************************************** *******

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#hnday=4
#mnday=00
nexttime = (#hnday * 3600)+(#mnday * 60)
tekhr.b=Hour(Date())
tekmn.b=Minute(Date())
nowtime = (tekhr * 3600)+(tekmn * 60)
 
den$=FormatDate("%dd", Date())
If nowtime < nexttime
den.b = Val(den$)
If den.b > 1
den.b=den.b - 1
If den.b < 10
den$ = "D0" + Str(den.b)
Goto A
EndIf
den$ = "D" + Str(den.b)
Goto A
EndIf
EndIf
den$ = "D" + den$
 
A:
mon$=FormatDate("M%mm", Date())
god$=FormatDate("G%yyyy", Date())
wdir$="C:/IRAM"
wdir2$="C:/IRAM/ARX_GRIB"
wdir3$="C:/IRAM/ARX_GRIB/" + god$
wdir4$="C:/IRAM/ARX_GRIB/" + god$ + "/" + mon$
wdir5$="C:/IRAM/ARX_GRIB/" + god$ + "/" + mon$ + "/" + den$
 
opn$="C:\IRAM\ARX_GRIB" + god$ + "" + mon$ + "" + den$
brif$=" E:\IRAM\ARX_GRIB" + god$ + "" + mon$ + "" + den$
 
If FileSize(wdir$)<> - 2
If CreateDirectory(wdir$)
EndIf
EndIf
If FileSize(wdir2$)<> - 2
If CreateDirectory(wdir2$)
EndIf
EndIf
If FileSize(wdir3$)<> - 2
If CreateDirectory(wdir3$)
EndIf
EndIf
If FileSize(wdir4$)<> - 2
If CreateDirectory(wdir4$)
EndIf
EndIf
If FileSize(wdir5$)<> - 2
If CreateDirectory(wdir5$)
EndIf
EndIf
 
processID.l = RunProgram("c:\robogrib.exe", opn$ + brif$ + " /PURGE /MON:1 /MOT:10", "C:")
Debug "ProcessID = " + Str(processID)
 
loop:
;Delay(3000000)
Delay(5000)
tekhr.b=Hour(Date())
tekmn.b=Minute(Date())
nowtime = (tekhr.b * 3600)+(tekmn.b * 60)
 
If nowtime = nexttime
Else
For i=1 To 14 Step 1
nowtime = nowtime - 60
If nowtime = nexttime
i=14  
EndIf
Next
 
If nowtime <> nexttime
Goto loop
EndIf
EndIf
 
Debug "Program terminated..."
KillProcess(processID)
-----------------------
пути подставил другие для проверки. сейчас код выглядит кусками. как его можно причесать/упростить (в частности проверки существования каталогов). В 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 минут
Никак не возьму в толк. Здесь не могут ответить или не хотят?
чуточку добавил кода.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#hnday=4
#mnday=00
nexttime = (#hnday * 3600)+(#mnday * 60)
 
tekhr.b=Hour(Date())
tekmn.b=Minute(Date())
nowtime = (tekhr * 3600)+(tekmn * 60)
 
den$=FormatDate("%dd", Date())
If nowtime < nexttime
den.b = Val(den$)
If den.b > 1
den.b=den.b - 1
If den.b < 10
den$ = "D0" + Str(den.b)
Goto A
EndIf
den$ = "D" + Str(den.b)
Goto A
EndIf
EndIf
den$ = "D" + den$
 
A:
mon$=FormatDate("M%mm", Date())
god$=FormatDate("G%yyyy", Date())
wdir$="C:/IRAM"
wdir2$="C:/IRAM/ARX_GRIB"
wdir3$="C:/IRAM/ARX_GRIB/" + god$
wdir4$="C:/IRAM/ARX_GRIB/" + god$ + "/" + mon$
wdir5$="C:/IRAM/ARX_GRIB/" + god$ + "/" + mon$ + "/" + den$
 
opn$="C:\IRAM\ARX_GRIB" + god$ + "" + mon$ + "" + den$
brif$=" E:\IRAM\ARX_GRIB" + god$ + "" + mon$ + "" + den$
 
If FileSize(wdir$)<> - 2
If CreateDirectory(wdir$)
EndIf
EndIf
If FileSize(wdir2$)<> - 2
If CreateDirectory(wdir2$)
EndIf
EndIf
If FileSize(wdir3$)<> - 2
If CreateDirectory(wdir3$)
EndIf
EndIf
If FileSize(wdir4$)<> - 2
If CreateDirectory(wdir4$)
EndIf
EndIf
If FileSize(wdir5$)<> - 2
If CreateDirectory(wdir5$)
EndIf
EndIf
 
processID.l = RunProgram("c:\robogrib.exe", opn$ + brif$ + " /PURGE /MON:1 /MOT:10", "C:", #PB_Program_Open)
Debug "ProcessID = " + Str(processID)
 
loop:
;Delay(3000000)
Delay(5000)
tekhr.b=Hour(Date())
tekmn.b=Minute(Date())
Debug tekhr
Debug tekmn
Debug "--------"
Debug ""
nowtime = (tekhr.b * 3600)+(tekmn.b * 60)
 
If nowtime = nexttime
Else
For i=1 To 14 Step 1
nowtime = nowtime - 60
Debug nowtime
If nowtime = nexttime
i=14  
EndIf
Next
 
If nowtime <> nexttime
Goto loop
EndIf
EndIf
 
Debug "Program terminated..."
 
KillProgram(processID)
CloseProgram(processID)
 
den$=FormatDate("D%dd", Date())
Goto A
примерно вот этого я и добивался (не писал ранее потому как ожидал от профессоров более красивого решения), но как бы не открывать и закрывать постоянно программу, а только перезагружать процесс robogrib.exe. А то в таком виде программа постоянно переводит фокус на себя и запускается всегда в разных местах экрана. В батничке работает все плавно, то есть окно консоли открывается только один раз. Да и сам процесс протекает фоном. Еще один вопрос, но уже второстепенный: а как задать title для окна?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.10.2012, 18:17
Ответы с готовыми решениями:

Из кода Си в код Ассемблер перевести нужно,можно быстро как-нибудь?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void main (void) {int a,b,n,d; d=0; system(&quot;chcp 1251&quot;); system (&quot;cls&quot;); ...

На основе кода REG-файла написать код BAT-файла
Всем Доброго Дня, попрошу вас меня понять) мне необходимо сделать батник из .reg файла ...

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона для функции 2*X12 - X1*X2 + 3*X22 -...

29
Кормпилятор
 Аватар для Quiet Snow
5043 / 1717 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
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
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.10.2012, 21:29
Цитата Сообщение от Dimk@ Посмотреть сообщение
что не нравится: открывается каждый раз в произвольном месте экрана, каждый раз переводит фокус на себя, когда должно работать в фоне.
Почему не добавите ключик #PB_Program_Hide -всё должно быть тихо и незаметно.

Цитата Сообщение от Dimk@ Посмотреть сообщение
как можно задать заголовок (title) консольного окна.
В справке прямым текстом
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
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
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
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
30.10.2012, 11:03
С robocopy.exe разобрался, работает утилита без комплекта.
Не могу понять что делает этот кусок кода
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#hnday=4
#mnday=00
nexttime = (#hnday * 3600)+(#mnday * 60)
 
tekhr.b=Hour(Date())
tekmn.b=Minute(Date())
nowtime = (tekhr * 3600)+(tekmn * 60)
 
den$=FormatDate("%dd", Date())
If nowtime < nexttime
den.b = Val(den$)
If den.b > 1
den.b=den.b - 1
If den.b < 10
den$ = "D0" + Str(den.b)
Goto A
EndIf
den$ = "D" + Str(den.b)
Goto A
EndIf
EndIf
den$ = "D" + den$
Хотелось бы просто узнать, что должна делать программа конкретно, с какой периодичностью и какими параметрами копировать-резервировать папки?
У меня сложилось стойкое мнение, что весь код уложится в 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
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
30.10.2012, 17:33
Цитата Сообщение от Dimk@ Посмотреть сообщение
Примерно такая вот логика.
Ну теперь ясна общая картина. Коротко сказать - эта утилита должна работать круглосуточно, копируя данные в папки, соответствующие датам, при изменении в исходных папках раз в 10 минут.
Смена суток в 4.00
Ок, попробую.

Добавлено через 4 часа 17 минут
Вот такой набросок получился. Это не конечная программа - нет нормального вывода данных ( в дебаг пока), и даже нет выхода из программы ( в следствии чего последний экземпляр robocopy.exe остаётся работать в процессах). Но принцип работы думаю ясен.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Procedure NewDir(); Создаем новые папки, запускаем копирование
opn$="C:\IRAM\ARX_GRIB\G%date:~6,4%\M%date:~3,2%\D%date:~0,2%"
brif$="E:\IRAM\ARX_GRIB\G%date:~6,4%\M%date:~3,2%\D%date:~0,2%"
options$ = opn$ +" "+ brif$ + " /PURGE /MON:1 /MOT:10" ; Параметры запуска
RunProgram("cmd.exe","/c md "+opn$,"",#PB_Program_Wait|#PB_Program_Hide)  ; Создаем новые папки
RunProgram("cmd.exe","/c md "+brif$,"",#PB_Program_Wait|#PB_Program_Hide) ; Создаем новые папки
 
Result = RunProgram("cmd.exe ", "/c C:\robocopy.exe "+ options$, "", #PB_Program_Open|#PB_Program_Hide|#PB_Program_Read|#PB_Program_Write); Запуск robocopy.exe
ProcedureReturn Result
EndProcedure
 
NewDay.b=0
processID.l = NewDir() ; Первый запуск
 
Repeat
  ; Перехватывам информацию в свою программу
  If AvailableProgramOutput(processID)
      ReadProgramData(processID, @Stdout, 1)
      Output$ + Chr(Stdout)
      If Stdout = #LF
        Debug Output$ ; контроль куда угодно можно вывести
        Output$ = ""
      EndIf
    EndIf
If Hour(Date())=0:NewDay=1:EndIf ; Наступили новые сутки
If Hour(Date())=4 And NewDay=1 ; Если уже 4.00 и новые сутки
  NewDay=0  ; Сбрасываем признак нового дня
  KillProgram(processID)
  CloseProgram(processID)
  KillProcess(GetPidProcess("robocopy.exe")) ; Это из библиотеки DROOPY, убиваем процесс
  Delay(1000); даем секунду на остановку
  processID=NewDir()  ; Создаем новые папки, , запускаем копирование
  
EndIf
Delay(1)
Until Quit=1 
KillProcess(GetPidProcess("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
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
30.10.2012, 21:23
Цитата Сообщение от Dimk@ Посмотреть сообщение
могу ли я после его запуска каким-то образом передавать через стандартный ввод/вывод (stdin-stdout) либо другим способом команды в досовском синтаксисе именно этой копии командного процессора?
Это нужно?
PureBasic
1
2
3
4
5
6
ID = RunProgram("cmd.exe","","", #PB_Program_Open|#PB_Program_Write)
If ID
  Delay(400)
  WriteProgramStringN(ID, "tracert cyberforum.ru")
  Delay(10000)
EndIf
В свойствах проекта нужно выбрать формат исполняемого файла "Console", иначе не сработает.
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
30.10.2012, 21:33
Цитата Сообщение от Dimk@ Посмотреть сообщение
как из pb передать "досовскую" команду в ранее запущенную консоль?
Маленький пример - в запущенную консоль даем команду "Exit"
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Prog = RunProgram("cmd", "", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write)
 
If IsProgram(Prog)
  Counter = 0
  Output$ = ""
  Stdout.a = 0
  While ProgramRunning(Prog)
   
    If AvailableProgramOutput(Prog)
      ReadProgramData(Prog, @Stdout, 1)
      Output$ + Chr(Stdout)
      If Stdout = #LF
        Debug Output$
        Output$ = ""
      EndIf
    EndIf
   
    Delay(1)
    Counter + 1
    If Counter = 3000
      WriteProgramStringN(Prog, "exit")
      Debug "Exit"
    EndIf
  Wend
  CloseProgram(Prog)
EndIf
А что неясно в цикле?
В сутках 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
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
31.10.2012, 11:38
Dimk@, посмотрите этот код.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ID = RunProgram("cmd.exe","","", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write)
If ID
  Tl_ID=RunProgram("telnet.exe","/?","",#PB_Program_Open|#PB_Program_Connect,ID)
  If Tl_ID
    Delay(2000)
    KillProgram(Tl_ID)
    CloseProgram(Tl_ID)
    Tl_ID=RunProgram("telnet.exe","o 192.168.1.1","",#PB_Program_Open|#PB_Program_Connect,ID)
    If Tl_ID
      Delay(2000)
      KillProgram(Tl_ID)
      CloseProgram(Tl_ID)
    EndIf
  EndIf
  
EndIf
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
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
31.10.2012, 14:33
Dimk@, вам нужно было запустить консольную программу так, чтобы вывод происходил в уже существующее консольное окно?
Цитата Сообщение от Dimk@ Посмотреть сообщение
Самые грабли, во что уперся - это как раз и есть реализация через PB "досовских" команд "start /b" и "taskkill...". чтобы убивать процесс, а консолька при этом не закрывалась.
Если да, то пример выше показывает как это сделать.
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
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
31.10.2012, 20:32
Цитата Сообщение от Dimk@ Посмотреть сообщение
можно файл robocopy.exe вмонтировать в скомпилированный exe
Можно. Или поместить в ресурс или использовать оператор IncludeBinary. Второе проще.

Цитата Сообщение от Dimk@ Посмотреть сообщение
будет ли он извлекаться на диск при запуске программы
Это уже зависит от того, как написать программу. Можно запускать из памяти без извлечения на диск.

Цитата Сообщение от Dimk@ Посмотреть сообщение
при работе она всегда обнаружит рядом с собой robocopy.exe
Зачем тогда помещать в EXE если проще скопировать robocopy.exe в одну папку с программой?
0
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 13
31.10.2012, 20:48  [ТС]
locm, можно простенький пример с IncludeBinary + без извлечения на диск.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.10.2012, 20:48
Помогаю со студенческими работами здесь

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока кода/отдельной функции или процедуры/программы...

Перевести в код Pascal ABC из кода Pascal Delphi
Помогите перевести в код ABC а то с Delphi вообще не знаком. Задание было такое: Записать в файл последовательного доступа N...

Перевести в код Pascal ABC из кода Pascal Delphi
procedure TForm1.Button1Click(Sender: TObject); const n=8; var x:array of real; y,z:array of real; i,j:byte; begin ...

В ярлыках браузеров emorhc.bat rehcnual.bat xoferif.bat erolpxei.bat
В ярлыках браузеров встроились вирусы и при открытии открывается реклама

Можно ли перевести BAT в VB6?
Вопрос можно ли перевести BAT в VB6 BAT добавляет назначенное задание ( батник работает нормально) ПРИМЕР: @echo off echo...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru