Вызовите .com файл с параметрами, используя VBA WScript.Shell - PullRequest
1 голос
/ 08 января 2020

Я использую 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:mypassword@mydomain.com/"
    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:mypassword@mydomain.com/"
    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

К сожалению, это не работает. Отчеты Excel:

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

при замене строка, таким образом, она работает:

execute_string = "notepad.exe"

Кажется, что wsh.Run не нравятся кавычки.
Как я могу сделать эту работу?

1 Ответ

0 голосов
/ 08 января 2020

Путь к 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:mypassword@mydomain.com/ "put D:\tmep\myfile.txt /myfolder/" "exit"

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

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