【问题标题】:Upload directories recursively (with directories in it) to FTP递归上传目录(其中包含目录)到 FTP
【发布时间】:2019-07-16 11:52:36
【问题描述】:

我需要将包含其他目录的完整目录从 Windows PC 上传到 FTP。

目前我正在使用 Windows 批处理文件将文件上传到 FTP:

FTP -i -s:upload.ftp

上传.ftp:

open hostname
username
Password
prompt
bin
cd pathonserv/path
prompt
mput localpath/localfolder/*

此代码仅从服务器上的本地文件夹上传文件,而不是本地文件夹中的文件夹。

我可以使用任何建议。我愿意将语言从 Windows 批处理文件更改为 Python。我还在 Windows PC 上启用了 Linux 终端功能。如果代码无需大量额外下载即可运行,也欢迎使用 C++。

安全不是很重要。目前我更喜欢速度而不是安全。我需要一个简单的脚本来递归地将目录(其中包含目录)上传到具有用户名和密码的 FTP。

Windows 也是必须的!我不希望有超过 1 个可下载的插件,但即使它有但可以工作,我也可以接受。

【问题讨论】:

  • 压缩、上传、解压呢?
  • @Xenobiologist 我完全同意。我试过了,但我找不到任何关于在 ftp 上解压缩 zip 文件的信息。也许你能帮忙?!
  • 您必须通过 putty 或任何其他可能的方式使用另一个会话才能在服务器上执行命令。
  • 另一种解决方案是通过您的路径记录。并为每个文件启动一个上传作业。我想,这将是 10 行代码,例如在 Windows 上自动设置。
  • @Xenobiologist 我肯定会这样检查!

标签: python windows batch-file ftp


【解决方案1】:

只需使用任何其他 Windows 命令行 FTP 客户端。大多数支持递归传输。

例如WinSCP FTP client,您可以使用以下批处理文件:

winscp.com /ini=nul /log=upload.log /command ^
    "open ftp://username:password@hostname/" ^
    "put C:\localpath\localfolder\* /pathonserv/path/" ^
    "exit"

WinSCP GUI 甚至可以generate a batch file template for you.

还有一个转换Windows FTP script to WinSCP 的指南(并不是说在这种微不足道的情况下真的需要它)。

(我是 WinSCP 的作者)


如果您想采用 Python 方式,请查看Upload folders from local system to FTP using Python script(忽略@monkut 接受的答案,answer by @Edgard 和其他一些更好)。

【讨论】:

  • 完美答案!我也想指定对我有用的代码。我在winscp网页上使用了你的答案。 "C:\Program Files\WinSCP\winscp.com" /ini=nul /command ^ "open username:password@hostname" ^ "put C:\localpath\localfolder* /pathonserv/path/" ^ "exit"
  • 有没有办法使用批处理检查 winScp 的安装和下载+安装(如果未安装)?
  • WinSCP 不需要安装。您可以简单地获取它的两个二进制文件并以与存储/分发批处理文件本身相同的方式存储/分发它们。
  • 完美!感谢您提供的所有信息和出色的应用程序!
【解决方案2】:

这将是 Autoit 解决方案。

;ftp- Upload

#include <Array.au3>
#include <File.au3>
#include <MsgBoxConstants.au3>
#include <FTPEx.au3>

$initialPath = 'c:\Users\xxx\Downloads\'

$fileStructure = _FileListToArrayRec($initialPath, '*', $FLTAR_FILESFOLDERS, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)
;~ _ArrayDisplay($fileStructure)

_Example()

Func _Example()
    Local $sServer = '192.168.178.XXX'
    Local $sUsername = 'admin'
    Local $sPass = 'xxx'
    Local $Err, $sFTP_Message

    Local $hOpen = _FTP_Open('MyFTP Control')
    Local $hConn = _FTP_Connect($hOpen, $sServer, $sUsername, $sPass, 0, 21, $INTERNET_SERVICE_FTP, $INTERNET_FLAG_PASSIVE)
    If @error Then
        MsgBox($MB_SYSTEMMODAL, '_FTP_Connect', 'ERROR=' & @error)
    Else
        _FTP_GetLastResponseInfo($Err, $sFTP_Message)
        ConsoleWrite('$Err=' & $Err & '   $sFTP_Message:' & @CRLF & $sFTP_Message & @CRLF)
        ; do something ...
        _FTP_DirSetCurrent($hConn, '/ALL')
        _FTP_DirPutContents($hConn, $initialPath, '/ALL', 1)
        Sleep(100)
        _FTP_DirSetCurrent($hConn, '/ALL')
        Local $aFile = _FTP_ListToArray($hConn, 0)
        _ArrayDisplay($aFile)
    EndIf
    Local $iFtpc = _FTP_Close($hConn)
    Local $iFtpo = _FTP_Close($hOpen)
EndFunc   ;==>_Example

【讨论】:

  • 感谢您的努力!此时马丁的回答被接受了。但这也很有效。