Вызов файла .com с параметрами с помощью VBA WScript.Shell

Я использую Excel для загрузки некоторых файлов на сервер с WinSCP. Этот пример работает:

Sub FTP_upload()
    Dim logfile, ftp_login, file_to_upload, upload_to_folder As String
    logfile = "D:\temp\ftp.log"
    ftp_login = "ftp://ftp_mydomain:[email protected]/"
    file_to_upload = "D:\tmep\myfile.txt"
    upload_to_folder = "/myfolder/"

    'upload the file
    Call Shell("C:\Program Files (x86)\WinSCP\WinSCP.com /log=" & logfile & " /command " & """open """ & ftp_login & " " & """put " & file_to_upload & " " & upload_to_folder & """ " & """exit""")
End Sub

Теперь я хочу, чтобы Excel дождался закрытия оболочки.

Используя информацию из Дождитесь завершения команды оболочки, я собрал это вместе код:

Sub FTP_upload_with_wait()
    Dim wsh As Object
    Set wsh = VBA.CreateObject("WScript.Shell")
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 1
    Dim errorCode  As Integer

    Dim logfile, ftp_login, file_to_upload, upload_to_folder As String
    logfile = "D:\temp\ftp.log"
    ftp_login = "ftp://ftp_mydomain:[email protected]/"
    file_to_upload = "D:\tmep\myfile.txt"
    upload_to_folder = "/myfolder/"

    execute_string = "C:\Program Files (x86)\WinSCP\WinSCP.com /log=" & logfile & " /command " & """open """ & ftp_login & " " & """put " & file_to_upload & " " & upload_to_folder & """ " & """exit"""

    errorCode = wsh.Run(execute_string, windowStyle, waitOnReturn)

End Sub

К сожалению, это не работает. Эксель сообщает:

ошибка времени выполнения '-2147024894 (80070002)'
Ошибка автоматизации
Система не может найти указанный файл

Когда я заменяю строку таким образом, она работает:

execute_string = "notepad.exe"

Похоже, wsh.Run не любит кавычки.
Как мне заставить это работать?


person Thomas    schedule 08.01.2020    source источник


Ответы (1)


Путь к WinSCP содержит пробелы, поэтому вам нужно заключить его в двойные кавычки (которые нужно удвоить, чтобы избежать их в строке VBA):

execute_string = """C:\Program Files (x86)\WinSCP\WinSCP.com"" ..."

Но это только первый набор кавычек, которые неверны в вашей команде.

Правильная команда будет выглядеть так:

execute_string = """C:\Program Files (x86)\WinSCP\WinSCP.com"" " & _
    "/log=" & logfile & " /command " & _
    """open " & ftp_login & """ " & _
    """put " & file_to_upload & " " & upload_to_folder & """ " & _
    """exit"""

Предполагая, что ни один из logfile, ftp_login, file_to_upload и upload_to_folder не содержит пробелов, в этом случае потребуется гораздо больше двойных кавычек.

Подробнее о синтаксисе командной строки WinSCP


Call Shell должна иметь некоторую эвристику, которая добавляет кавычки вокруг C:\Program Files (x86)\WinSCP\WinSCP.com. Хотя это просто удача, что остальная часть командной строки работает, кавычки и там неверны. Так что даже ваш первый код неверен. Он выполняет следующую команду:

"C:\Program Files (x86)\WinSCP\WinSCP.com" /log=D:\temp\ftp.log /command "open "ftp://ftp_mydomain:[email protected]/ "put D:\tmep\myfile.txt /myfolder/" "exit"

(Обратите внимание на неуместные кавычки вокруг open)

person Martin Prikryl    schedule 08.01.2020
comment
Добро пожаловать. Хотя в Stack Overflow лучше поблагодарить, проголосовав за ответ. - person Martin Prikryl; 13.01.2020