Как выполнить несколько пакетных файлов один за другим в VBA? [дубликат]


На этот вопрос уже есть ответ здесь:

У меня есть два пакетных файла. Первый - это загрузка файлов из SFTP. Второй-манипулировать некоторыми локальными файлами. Так как я должен ждать, пока первый не будет закончен, как держать программу в VBA так пакетные файлы могут выполняться один за другим?

Прямо сейчас я использую

Call Shell("Bat1.bat")
Call Shell("Bat2.bat")

Однако два пакетных файла будут выполняться одновременно. Bat2.bat не будет ждать Bat1.bat.

Спасибо

1 2

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 , которую Тим Уильямс предоставил в комментарии