Excel 使用VBA运行WinSCP脚本

Excel 使用VBA运行WinSCP脚本,excel,vba,cmd,winscp,Excel,Vba,Cmd,Winscp,我可以使用以下代码从CMD窗口中的SFTP下载文件: WinSCP.com #连接到主机并使用密码登录 开放用户:pw@address #获取远程目录中的所有文件并将其下载到特定的本地目录 lcd C:\Users\xx\Desktop 获取*.xlsx #关闭并终止会话 出口 我在网上搜索,发现我可以把这些代码放在bat文件中并使用 Call Shell("cmd.exe /c C:\Users\xx\Desktop\WinSCPGet.bat", 1) 但是,仅执行bat文件WinSCP

我可以使用以下代码从
CMD
窗口中的SFTP下载文件:

WinSCP.com
#连接到主机并使用密码登录
开放用户:pw@address
#获取远程目录中的所有文件并将其下载到特定的本地目录
lcd C:\Users\xx\Desktop
获取*.xlsx
#关闭并终止会话
出口
我在网上搜索,发现我可以把这些代码放在
bat
文件中并使用

Call Shell("cmd.exe /c C:\Users\xx\Desktop\WinSCPGet.bat", 1)
但是,仅执行bat文件
WinSCP.com
的第一行。它将弹出
cmd
窗口,显示此内容,而不执行任何其他操作。

如何一次执行所有行


谢谢

您的代码不是Windows批处理文件。这是一个Windows命令,后跟WinSCP命令。第一个命令运行
winscp.com
应用程序,然后应用程序坐在那里等待输入。如果您最终关闭它,Windows命令解释器(
cmd.exe
)将继续执行其余的命令,大多数命令失败,因为它们不是Windows命令。另请参见和WinSCP常见问题解答

因此,您必须将命令(
open
to
exit
)保存到WinSCP脚本文件(比如
script.txt
)中,并使用以下命令执行脚本:

或者,使用以下命令指定WinSCP命令行上的所有命令:

关于引号:使用
/command
开关,必须将每个命令用双引号括起来。在VBA字符串中,要使用双引号,必须通过将其加倍来对其进行转义


还请注意,您通常应该使用to。这样,您还可以确保脚本将在其他机器上运行。您的脚本不会,因为它缺少to。使用
/ini=nul
将帮助您认识到这一点


您可以为自己准备(包括
-hostkey


另请参见。

我喜欢这个小而紧凑的过程,并在我自己的项目中使用它。不需要临时文件。快速可靠

将字符串
src
(绝对文件路径)解析为
uploadImageByFTP
。Etc.C:\Users\user\Desktop\image.jpg,文件将被上传

替换:

  • 使用FTP用户
  • 使用FTP密码
  • 带有FTP主机名(etc.example.com)
  • 带有WinSCP客户端上的路径(等C:\Program Files(x86)\WinSCP\WinSCP.com.注意事项
    WinSCP.com
    而不是
    WinSCP.exe
  • 带有FTP客户端上的路径(etc./httpdocs/wp content/uploads)
-

Sub-uploadImageByFTP(src作为字符串)
将脚本设置为对象:Set script=VBA.CreateObject(“WScript.Shell”)
Dim waitOnReturn为布尔值:waitOnReturn=True
将WindowsStyle设置为整数:WindowsStyle=1
“不是空的
如果是(src vbNullString),则
'执行脚本
脚本。运行_
""""" " + _
“/ini=nul”+_
“/命令”+_
“打开ftp:/:@/”+_
“cd”+_
“放置”&“src&”和“+_
“关闭”+_
“退出”,窗口样式,等待返回
如果结束
端接头
-

WScript.Shell
比默认的
Shell()
更强大,因为您可以附加一个
waitOnReturn
-命令;这告诉VBA,在文件上载到FTP服务器之前,不允许进一步执行

如果不希望在每次执行时打开命令提示符,请将
windowStyle
更改为0

Call Shell("C:\path\winscp.com /ini=nul /script=c:\path\script.txt")
Call Shell("C:\path\winscp.com /ini=nul /command ""open user:pw@address"" ""lcd C:\Users\xx\Desktop"" ""get *.xlsx"" ""exit""")
    Sub uploadImageByFTP(src As String)
        Dim script As Object: Set script = VBA.CreateObject("WScript.Shell")
        Dim waitOnReturn As Boolean: waitOnReturn = True
        Dim windowStyle As Integer: windowStyle = 1

        'Not empty
        If (src <> vbNullString) Then

           'Execute script 
            script.Run _
                """<WinSCP.com path>"" " + _
                "/ini=nul " + _
                "/command " + _
                """open ftp://<username>:<password>@<hostname>/"" " + _
                """cd <FTP-path>"" " + _
                """put " & """""" & src & """""" & """ " + _
                """close"" " + _
                """exit""", windowStyle, waitOnReturn

        End If

    End Sub