Попытка запустить скрипт .bat из VBA завершается неудачно без кода ошибки - PullRequest
2 голосов
/ 03 апреля 2019

РЕЗЮМЕ: Я пытаюсь запустить скрипт .bat на компьютере с Windows, используя Excel VBA.Я нашел ссылки в Интернете, описывающие, как это сделать, и я следовал инструкциям, содержащимся в нем.Однако мой файл .bat не работает.

ДЕТАЛИ. Мой файл .bat ("test.bat") содержит следующий код:

echo off
echo This is a test...
pause
exit

Он расположен на моем рабочем столе,по следующему пути: «C: \ Users \ User1 \ Desktop».Когда я дважды щелкаю этот файл .bat или вызываю его из командной строки, он демонстрирует желаемое поведение.А именно, он останавливается и ждет, пока я нажму любую клавишу.

Я пытаюсь запустить этот же файл .bat из Excel VBA, используя следующий код:

Sub testBatchScript()

    'Print a message to the immediate window to confirm subroutine execution
    Debug.Print "The subroutine is running."

    'Initialize a windows shell object
    Dim wsh As WshShell
    Set wsh = New WshShell

    'Construct the full path to the .bat file
    Dim fullPath As String
    fullPath = Chr(34) + "C:\Users\User1\Desktop\test.bat" + Chr(34)

    'Run the .bat file
    Dim eCode As Long
    eCode = wsh.Run(fullPath, waitonreturn:=True, windowstyle:=1)

    If eCode <> 0 Then
        MsgBox ("An error occurred.")
    End If

End Sub

Когда я запускаю этуподпрограмма, ничего не происходит.Не появляется окно CMD и не появляется окно сообщения, указывающее на ошибку.Однако я знаю, что подпрограмма запущена из-за сообщения, которое появляется в ближайшем окне.

Я озадачен тем, почему это не работает.Что еще больше удивляет, так это то, что я смог успешно вызывать сценарии .bat из VBA всего несколько недель назад.Предложение в комментариях ниже, я обновил код VBA с обработкой ошибок:

Option Explicit

Sub testBatchScript()

    On Error GoTo EH:

    'Print a message to the immediate window to confirm subroutine execution
    Debug.Print "The subroutine is running."

    'Initialize a windows shell object
    Dim wsh As WshShell
    Set wsh = New WshShell

    'Construct the full path to the .bat file
    Dim fullPath As String
    fullPath = Chr(34) + "C:\Users\User1\Desktop\test.bat" + Chr(34)

    'Run the .bat file
    Dim eCode As Long
    eCode = wsh.Run(fullPath, waitonreturn:=True, windowstyle:=1)

    If eCode <> 0 Then
        MsgBox ("An error occurred.")
    End If

    Exit Sub

EH:
    MsgBox ("The error description is: " & Err.Description)

End Sub

Когда я запускаю этот код, все равно ничего не происходит.

ОБНОВЛЕНИЕ2: IЭтим утром снова запустили тестовый код, после перезагрузки компьютера, и в этот раз я получил всплывающее сообщение: "Описание ошибки: Разрешение отказано".Затем я снова запустил код, чтобы посмотреть, смогу ли я воспроизвести это сообщение об ошибке, и всплывающего окна не было!Кроме того, я не могу получить сообщение об ошибке, независимо от того, сколько раз я запускаю код.Так что перезапуск, похоже, что-то сделал ...

Сообщение «Отказано в доступе» предполагает, что это проблема безопасности.У кого-нибудь есть идеи по ее решению?

1 Ответ

1 голос
/ 03 апреля 2019

Не ответ, но слишком долго для комментария:

Если вы поместили в файл следующее, сохраните его как test.vbs (не как текстовый документ: блокнот создаст test.vbs.txt, если вы не будете осторожны):

Dim wsh, fullPath, ecode
Set wsh = WScript.CreateObject("WScript.Shell")
fullPath = "C:\programs\test.bat"
ecode = wsh.Run(fullPath, 1, True)
msgbox(ecode)

(с полным путем, настроенным в вашей ситуации). Сохраните это, например, в. рабочий стол и щелкните значок. Что происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...