Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056

Отловить завершение процедуры, которая запускает окно cmd

18.02.2014, 18:10. Показов 1487. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте парни!
Раньше пользовался макрокомандами, сейчас стараюсь полностью на VBA перейти, частично появились проблемы. Прошу помочь.
В общем я объединяю много файлов .txt из одной определенной папки в один файл, код ниже
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
Private Sub Obedinenie()
pachb = Application.CurrentProject.Path
path1 = pachb & "\Отсюда\"
path2 = pachb & "\Сюда\"
  Call Shell("cmd /c copy """ & path1 & "*.txt"" """ & path2 & "Общий.txt""")
MsgBox ("Готово")   'выскикавает раньше чем закончиватся объединение файлов
End Sub
Как видно объединяет не access, а Виндовский командер. Мне разницы нет на самом деле, ну некрасиво немного что в фоновом режиме черный экран всплывает не проблема. Проблема в том, что процедура заканчивается прежде, чем пройдет объединение файлов, т.к. как я понимаю Акс не следит за финишем.
Если я сделаю так (запущу с кнопки несколько готовых процедур, которые зависят по очередности друг от тдруга), то ни к чему хорошему не приведет.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
Private Sub procedure2()
Call Obedinenie
Call Novaya_Procedura ' Эта вторая процедура начинается раньше чем скроется окно Командера из предыдущей процедуры
End Sub
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2014, 18:10
Ответы с готовыми решениями:

Не запускает программу через cmd
Если вручную запускать .exe, то программа нормально все делает, но если запускать через cmd получаю лишь черный екран, как от cmd но без...

Отловить завершение системы
Из-за того что в событии FormClosing свойство e.Cancel = true; при завершении системы появляется окно для завершения программы. ...

Bat файл запускает 2 процесса cmd
Добрый день, прошу подсказать что у меня не так. Суть кода - запуск батника - проверка на наличие файла в папке - если файла нет -...

13
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
18.02.2014, 20:01
Лучший ответ Сообщение было отмечено Серж_87 как решение

Решение

Удобно использовать VB-скриптовский Run. Последний параметр, если True, переводит из ассинхронного режима в синхронный и ждет окончания процесса
Visual Basic
1
2
3
4
5
6
Public Function RunHidenAndWait_Wsh(FilePath As String) 'дождаться выполнения внешней команды
    Dim Wsh
    Set Wsh = CreateObject("Wscript.Shell")
    Call Wsh.Run(FilePath, 0, True)
    Set Wsh = Nothing
End Function
Запуск
Visual Basic
1
RunHidenAndWait_Wsh "cmd /c copy """ & path1 & "*.txt"" """ & path2 & "Общий.txt"""
Второй параметр если 0, то выполнение в скрытом режиме. Но можно менять
Visual Basic
1
2
3
4
5
6
7
'0  Запуск в скрытом виде
'1  Обычный размер окна, если окно свернуто или развернуто на весь экран, то ему возвращается исходный вид и положение на экране
'2  Запуск в свернутом виде
'3  Развернутое на весь экран
'4  Запуск в обычном размере, в неактивном состоянии (без фокуса)
'8  Обычный размер в неактивном состоянии, но в фокусе остается запустившее приложение
'object.Run (strCommand, [intWindowStyle], [bWaitOnReturn])
2
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
18.02.2014, 20:25  [ТС]
mobile, Гениально Спасибо большое. Заодно и в фоне объединение проходит на глаза не попадается черный экран и процедура раньше времени вторая не запускается ))
0
163 / 27 / 1
Регистрация: 09.06.2008
Сообщений: 50
19.02.2014, 14:15
А чего Вы через VBA не объединяете?
Типа через терни к звёздам?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Sub SumFiles(Path1 As String, Path2 As String, SumFilePath As String)
Dim F1Buff, F2Buff
    Open Path1 For Input As #1
    Open Path2 For Input As #2
    Open SumFilePath For Output As #3
 
    Input #1, F1Buff
    Input #2, F2Buff
    Write #3, F1Buff, F2Buff
    Close #1
    Close #2
    Close #3
End Sub
2
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
19.02.2014, 17:55  [ТС]
Цитата Сообщение от mag_master Посмотреть сообщение
А чего Вы через VBA не объединяете?
как показали 1,5 года назад так и объединяю Мне главное результат, чтобы - объединяло
Вот смотрю я в Ваш код и такое впечатление склыдывается будто она на другом ЯП написан.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Sub SumFiles(Path1 As String, Path2 As String, SumFilePath As String)  'Оьъявляем паметры для Путь1, Путь2, Путь3
Dim F1Buff, F2Buff  'Какие то переменные непонятно для чего нужны
    Open Path1 For Input As #1 'Вот, что здесь происходит? Что такое #1,#2  и т.д. ?
    Open Path2 For Input As #2
    Open SumFilePath For Output As #3
 
    Input #1, F1Buff  'Аналогично ничего не понятно здесь
    Input #2, F2Buff
    Write #3, F1Buff, F2Buff
    Close #1  'Что так много закрываем всего?
    Close #2
    Close #3
End Sub

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

Добавлено через 2 минуты
И самое главное - есть плюс у этого кода перет тем как я объедяняю (скорость может)?
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.02.2014, 18:25
emenem97, в процедуре от mag_master использованы стандартные средства VB и VBA. Оператор Open открывает файл. For Input - для чтения, For Output - для записи. Оператор Input читает файл в переменную F1Buff или F2Buff. Оператор Write пишет в файл с именем, записанным в переменной SumFilePath. #1, #2 и #3 номера открытых файлов.

Не уверен, что чтение и запись по этому методу будет быстрее, чем примененный вами. Но зато гарантировано последовательность и синхронность действий.
2
914 / 562 / 88
Регистрация: 13.02.2014
Сообщений: 2,082
20.02.2014, 07:59
А если обернуть код mag_master в цикл, да таскать файлы из папки в коллекцию (см. код), вообще шик будет!
Visual Basic
1
2
3
4
5
6
Dim coll As New Collection, filename
    filename = Dir(FolderPath$ & "*.txt")
    While filename <> ""
        coll.Add filename ' считываем в колекцию coll нужные имена файлов
        filename = Dir
    Wend
0
163 / 27 / 1
Регистрация: 09.06.2008
Сообщений: 50
20.02.2014, 11:30
Тот код, который я привел, нормально работает только для текстовых файлов.
Переработанный вариант процедуры, который работает для любых файлов.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Sub SumFiles(Path1 As String, Path2 As String, SumFilePath As String)
Dim F1Buff() As Byte, F2Buff() As Byte  'В двоичном режиме данные это массив байтов
    Open Path1 For Binary As #1         'Открываем первый файл в двоичном режиме
    Open Path2 For Binary As #2         'Открываем второй файл в двоичном режиме
    Open SumFilePath For Binary As #3   'Открываем объединенный файл
    
    ReDim F1Buff(FileLen(Path1))        'Задаём размер буфера для первого файла
    ReDim F2Buff(FileLen(Path2))        'Задаём размер буфера для второго файла
 
    Get #1, , F1Buff                    'Считываем данные в первый буфер
    Get #2, , F2Buff                    'Считываем данные во второй буфер
    Put #3, , F1Buff                    'Записываем данные из первого буфера
    Put #3, , F2Buff                    'Записываем данные из второго буфера
    Close                               'Всё закрываем
End Sub
Проверил оба способа (и этот и предложенный mobile), на больших файлах (оба по 30мб).
Оба способа работают быстро. Замерить разницу в скорости не получилось.

Просто, в рамках одной информационной системы, пользоваться её встроенными возможностями и логичнее и удобнее, имхо.
2
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
20.02.2014, 18:12  [ТС]
Парни, пытаюсь воспользоваться кодом и склеить хотя бы два файла. Не получается. Посмотрите мой код, пожалуйста, в чем у меня ошибка?
Кликните здесь для просмотра всего текста
Visual Basic
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
Dim Path1 As String
Dim Path2 As String
Dim SumFilePath As String
 
Private Sub Кнопка0_Click()  'Запускаю процедуру  SumFiles с кнопки
 
Path1 = "E:\Тест\Файл1.txt"  'это значение переменных для параметра
Path2 = "E:\Тест\Файл2.txt"
SumFilePath = "E:\Тест\Общий/txt"
 
Call SumFiles(Path1, Path2, SumFilePath) 
MsgBox ("Готово")
End Sub
 
Public Sub SumFiles(Path1 As String, Path2 As String, SumFilePath As String)  'Процедару объединения
Dim F1Buff() As Byte, F2Buff() As Byte
    Open Path1 For Binary As #1
    Open Path2 For Binary As #2
    Open SumFilePath For Binary As #3
    
    ReDim F1Buff(FileLen(Path1))
    ReDim F2Buff(FileLen(Path2))
 
    Get #1, , F1Buff
    Get #2, , F2Buff
    Put #3, , F1Buff
    Put #3, , F2Buff
    Close
End Sub
0
Эксперт MS Access
 Аватар для ltv_1953
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
20.02.2014, 18:18
Цитата Сообщение от emenem97 Посмотреть сообщение
"E:\Тест\Общий/txt"
А какая ошибка то? Визуально вот здесь что-то странное.
1
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
20.02.2014, 18:40  [ТС]
ltv_1953, А я то и не заметил такую элементарщину. Спасибо, теперь работает.
Сейчас еще в цикл поместить попытаюсь чтобы с папки все подряд собирало и вообще прекрасно будет

Добавлено через 18 минут
да ну, код километровый получается.
У меня вон изначально на ЧЕТЫРЕ строчки код, который объединяет все файлы из указанной папки. А тут без цикла пробега по всем файлам из каталога уже длинющий получается. К тому же разницы никакой нет как объдинять. Только путаться потом
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
20.02.2014, 18:53
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Sub SumFiles(Path1 As String, SumFilePath As String)
Dim F1Buff() As Byte, F2Buff() As Byte  'В двоичном режиме данные это массив байтов
Dim d
    Open SumFilePath For Binary As #3   'Открываем объединенный файл
    d=Dir(Path1)
    Do until d=""
        Open Path1 For Binary As #1         'Открываем первый файл в двоичном режиме
        ReDim F2Buff(FileLen(Path2))        'Задаём размер буфера для второго файла
        Get #1, , F1Buff                    'Считываем данные в первый буфер
        Put #3, , F1Buff                    'Записываем данные из первого буфера
        Close #1                              'Всё закрываем
        d=dir
    Loop
    Close #3
End Sub
обращение к процедуре
Visual Basic
1
2
3
4
Path1 = "E:\Тест\*.txt"  'это значение переменных для параметра
SumFilePath = "E:\Тест\Общий\txt"
 
Call SumFiles(Path1, SumFilePath)
1
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
20.02.2014, 19:13  [ТС]
mobile, Спасибо
Думал все сложней
0
163 / 27 / 1
Регистрация: 09.06.2008
Сообщений: 50
21.02.2014, 08:17
В вызове процедуры Call можно не использовать:
SumFiles Path1, Path2, SumFilePath
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2014, 08:17
Помогаю со студенческими работами здесь

Как отловить завершение сессии?
здрасьте )) мне нужно при завершении сессии или при закрытии окна пользователем удалить таблицу в базе ... если кто нидь знает как это...

Как отловить завершение видовс
Мне надо что бы моя прога отловила завершение и не дала windows завершиться и что система не убила моя пргогу такое реально ?

Runtime.getRuntime().exec(cmd). Запускает только по закрытию приложения
Приветствую! Суть задачи запустить программу передав ей параметры. Сейчас программа запускается, но только после закрытия текущей. ...

Завершение процесса cmd по имени окна
Здравствуйте все. Фрагмент исполняемого bat файла: tasklist /v /fi &quot;imagename eq cmd.exe&quot; /fo csv /nh |findstr Profile1&gt;nul if...

Ожидание завершение процесса порожденного cmd.exe
Проблема такая. Запускаю cmd.exe c переназначенным вводом/выводом в анонимные каналы. С помощью CreateProcess (). Записываю в...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru