Как выполнить несколько пакетных файлов один за другим в VBA? [дубликат]
На этот вопрос уже есть ответ здесь:
- дождитесь завершения работы оболочки, затем отформатируйте ячейки-синхронно выполните команду 5 ответов
У меня есть два пакетных файла. Первый - это загрузка файлов из SFTP. Второй-манипулировать некоторыми локальными файлами. Так как я должен ждать, пока первый не будет закончен, как держать программу в VBA так пакетные файлы могут выполняться один за другим?
Прямо сейчас я использую
Call Shell("Bat1.bat")
Call Shell("Bat2.bat")
Однако два пакетных файла будут выполняться одновременно. Bat2.bat
не будет ждать Bat1.bat
.
Спасибо
1 ответ:
Во-первых, отбросьте утверждение
Call
, оно не нужно.Shell "Bat1.bat"
Сделайте
Bat1.bat
создать пустой файл "маркер", когда это будет сделано, напримерbat1.ready
. Затем сделайте цикл кода VBA, пока он не найдет этот файл.ready
:While Dir("bat1.ready") = vbNullString DoEvents Wend
Это должно держать ваш интерфейс/хост-приложение отзывчивым, в то время как по существу ничего не делать, пока файл маркера не будет вверх.
Далее вы удаляете файл маркера и переходите к
bat2
:Kill "bat1.ready" Shell "Bat2.bat"
Та-да!
Функция
Shell
возвращает немедленно , и возвращает созданный TaskID. Если вы не можете изменить пакетный файл каким-либо образом (или спросить, кто может изменить его, если они могут это сделать), то вам, вероятно, потребуется использовать некоторые вызовы Win32, чтобы использовать этот TaskID, чтобы определить, завершена ли задача, как в ссылкеShellAndWait , которую Тим Уильямс предоставил в комментарии