自动上传到 FTP 服务器

自动上传到 FTP 服务器

我有两个本地办公室用户需要扫描文档,然后让它们自动上传到远程终端服务器。我可以设置扫描软件将文件保存到某个文件夹,但我想自动将它们上传到 TS,这样他们就不必离开会话来上传文件。 哪一个是适用于 xp 的好的文件夹监视程序,我可以使用它来自动上传这些文件?

服务器是 Win 2000,我不确定在 Windows 上通常如何完成此操作。我知道我可以使用 WinSCP 作为可编写脚本的 ftp 客户端,但我不知道通常使用什么工具来监视文件夹的更改。直觉告诉我是 Powershell,但我不知道。我的 Python 不够好,我不想在他们的计算机上安装它,但这可能是最后的选择。

---这是我四处寻找后发现的。--- 今天这个及时的线程展示了 Debian Linux 上的一个很好的实用程序(新用户的一个超链接)/questions/50127/当目录内容在 lin 中发生变化时如何自动运行脚本 并且这个线程是我在 serverFault 上找到的最接近的,但却走错了方向。某种来自 FTP 站点的自动下载器?

(META ps 有没有办法删除标签。有一个“uploads”标签应该是“upload”。不需要复数。)

答案1

您可以使用 WinSCP 执行此类自动上传。它通常与 SFTP 或 SCP 一起使用,但它也支持普通 FTP(您的服务器实际上可能能够使用 SFTP 或 SCP),并且可以使用其自动化脚本自动执行此操作:

WinSCP 自动化指南

您正在寻找的具体命令是keepuptodate

http://winscp.net/eng/docs/script_commands

答案2

问题keepuptodate是,它执行整个同步,速度很慢。使用一些脚本,可以在修改后仅上传更改的文件。

您可以使用文件夹作为文件夹监视程序。然后使用 Gawk 处理其输出,当然还要使用 WinSCP 进行上传。整个过程可以通过简单的批处理脚本来控制:

REM 本地目录(递归)。REM %CD% - 当前工作目录。必须以 '\' 结尾。设置“localPath=%CD%\”

REM Remote directory, must end with '/'
set "remotePath=/some/remote/directory"

REM Name of the stored session in WinSCP
set "[email protected]"

REM --------------------------------------------------------

REM Escape local path - replace '\' with '\\'.
set "escapedLocalPath=%localPath:\=\\%"

foldermon -lastwrite -subdirs %localPath% | ^
gawk -f autoupload.awk -v "localPath=%escapedLocalPath%" -v "remotePath=%remotePath%" -v "session=%session%" | ^
winscp.com /console | ^
gawk "{ if (!/#aaaaaaaaaaaaaaaaa/) print; }"

当然,你需要那个 gawk 脚本(autoupload.awk):BEGIN {# 用于修复 foldermon 中错误(功能?)的变量。# 保存文件时,foldermon 会在同一秒内报告两个更改。lastLocalFile = "" lastTime = ""

    # Init and connect
    print "#remotePath=", remotePath
    print "#localPath=", localPath
    print "#session=", session

    print "option batch abort"
    print "option confirm off"
    print "open " session
    print "option transfer binary"
    #print "cd " remotePath

    # Flush AWK buffer.
    for (i=0; i<41; i++)
        print "#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}

{
    if (match ($0, /^([:0-9]*) File modified: (.*)$/, matchRow)) {
        # File changed.

        time = matchRow[1]
        file = matchRow[2]
        localFile = localPath file

        # Don't upload same file twice immediately.
        if (localFile!=lastLocalFile || lastTime!=time) {
            lastLocalFile = localFile
            lastTime = time

            # Extract subdirectory from change report and convert '\' to '/'.
            match (file, /^((.*[\\])*).*$/, matchPath);
            path = matchPath[1]
            gsub(/\\/, "/", path)

            # Change remote dir and upload.
            #print "cd " remotePath path
            print "put", localFile, remotePath path

            # Flush AWK buffer.
            for (i=0; i<41; i++)
                print "#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
        }
    }
}

END {
    # Disconnect.
    print "close"
    print "exit"
}

您可以从以下位置下载包含所有内容的 zip 文件这里

答案3

我在使用 Strix 提供的自动上传脚本时遇到了一些问题,不得不对其进行一些修改才能与 Sublime Text 3 配合使用(不确定 Sublime Text 2 是否以相同的方式工作)。

如果您遇到他的脚本无法运行或上传空白(以及所有内容)的问题,请使用此修改后的版本替换 autoupload.awk 的中间函数:

  {
    if (match ($0, /^([:0-9]*) File modified: (.*)$/, matchRow)) {
      # File changed.

        time = matchRow[1]
        file = matchRow[2]

      # Sublime Text 2/3 creates several files and appends some temporary characters after the original file name like this: myfile~RF34be688.TMP.
      # The original version of this program didn't handle this correctly and uploaded everything to the server
      # until you killed the script
      # This if statement below handles this by matching for only the lines that have the ~ (tilde chracter)

      if ( match (file,/~/) ) {

          tildePOS = match (matchRow[2],/~/)
          file = substr(matchRow[2], 1, tildePOS - 1)

          localFile = localPath file

          # Don't upload same file twice immediately.

          if (localFile!=lastLocalFile || lastTime!=time) {
            lastLocalFile = localFile
            lastTime = time

            # Extract subdirectory from change report and convert '\' to '/'.
            match (file, /^((.*[\\])*).*$/, matchPath);
            path = matchPath[1]
            gsub(/\\/, "/", path)

            # Change remote dir and upload.
            #print "cd " remotePath path
            print "put", localFile, remotePath path

            # Flush AWK buffer.
            for (i=0; i<41; i++)
              print "#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
          }
      }
    }
  }

希望这可以帮助到别人!

相关内容