我需要从 Excel 的宏中自动将文件上传到 FTP 服务器。
我遵循一个简单的路径,即创建脚本文件,然后使用该脚本文件中的命令运行 FTP.exe。问题是,如果从 VBA 脚本中执行 FTP.exe,则文件无法正确上传 - 它被创建,但服务器上有 0 个字节。但是当我从 shell 运行 FTP 命令(使用完全相同的脚本文件)时,文件可以正确上传。
我的脚本如下所示:
Sub Przycisk1_Klikniecie()
TempScriptFile = "D:\Temporary\ScriptFile.txt"
SourcePath = "(local path)"
SourceFilename = "(local file)"
Set FSO = CreateObject("scripting.filesystemobject")
Open TempScriptFile For Output As #1
Print #1, "open (host)"
Print #1, "(user)"
Print #1, "(password)"
Print #1, "binary"
Print #1, "lcd " & SourcePath
Print #1, "put " & SourceFilename
Print #1, "bye"
Print #1, "exit"
Close #1
If FSO.FolderExists("C:\Windows\System32") = False Then
Shell "C:\WINNT\system32\cmd /c ftp.exe -s:" & TempScriptFile, vbNormalFocus
Else
Shell "C:\WINDOWS\system32\cmd /c ftp.exe -s:" & TempScriptFile, vbNormalFocus
End If
Kill TempScriptFile
End Sub
环境:Windows 10,Microsoft Office 2013。
需要注意的是:同一个脚本可以在两台不同的机器上运行(Win7/Office 2007 和 Win10/Office 2016)。
我究竟做错了什么?
以下是从 Excel 执行的 FTP 日志:
ftp> open <host>
Connected to <host>.
220 FTP Server
---> OPTS UTF8 ON
500 OPTS UTF8 not understood
User (<host>:(none)):
---> USER <user>
331 Password required for <user>
---> PASS <password>
230 User <user> logged in
ftp> lcd <folder>
Local directory now <folder>
ftp> binary
---> TYPE I
200 Type set to I
ftp> put <file>
---> PORT 10,132,8,219,197,121
200 PORT command successful
---> STOR <file>
425 Unable to build data connection: Connection timed out
ftp> bye
---> QUIT
221 Goodbye.
注意425 Unable to build data connection: Connection timed out
。为什么会发生这种情况?
答案1
我为这个问题苦苦挣扎了好几个月。今天终于偶然发现了解决方案。64 位 Windows 上有两个 ftp.exe 应用程序(System32 和 SysWOW64)。只有 System32 版本才被允许通过我的 Windows Defender 防火墙。我添加了另一个,现在它运行正常!