Назад | Перейти на главную страницу

Автоматическая загрузка на FTP-сервер

У меня есть два локальных пользователя в офисе, которым нужно сканировать документы, а затем автоматически загружать их на удаленный терминальный сервер. Я могу настроить программу сканирования на сохранение файлов в определенной папке, но я хотел бы автоматически загружать их в TS, чтобы им не приходилось выходить из сеанса для загрузки файлов. Какой хороший наблюдатель папок для XP, который я могу использовать для автоматической загрузки этих файлов?

Сервер - это Win 2000, и я не уверен, как это обычно делается в Windows. Я понимаю, что могу использовать WinSCP в качестве ftp-клиента со сценариями, но не знаю, какой инструмент обычно используется для отслеживания изменений в папке. Интуиция подсказывает Powershell, но я не знаю. Мой Python не готов к работе, и я не хочу устанавливать его на их компьютеры, но это может быть последний вариант.

--- Это то, что я обнаружил, осматриваясь. --- В этой своевременной ветке с сегодняшнего дня показана хорошая утилита на Debian Linux (одна гиперссылка для новых пользователей) / questions / 50127 / how-to-automatic-run-a-script -when-the-contents-of-a-directory-changes-in-lin И этот поток является самым близким, что я нашел на serverFault, но идет неверным путем. Какой-то автозагрузчик с FTP-сайта?

(META ps. Есть ли способ удалить теги. Есть один тег для «загрузки», который, вероятно, должен быть «загрузка». Не нужно использовать множественное число.)

Вы можете использовать WinSCP для выполнения такой автоматической загрузки. Обычно он используется с SFTP или SCP, но также поддерживает простой FTP (на самом деле ваш сервер может поддерживать SFTP или SCP), и это можно автоматизировать с помощью сценариев автоматизации:

Руководство по автоматизации WinSCP

Конкретная команда, которую вы ищете, это keepuptodate:

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

Проблема с keepuptodate заключается в том, что он выполняет всю синхронизацию, что является медленным. Немного написав скрипты, можно загружать только измененные файлы после их модификации.

Ты можешь использовать FolderMon в качестве наблюдателя за папками. Затем обработайте его вывод 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 "session=stored@session.com"

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-файл со всем включенным из Вот.

У меня возникли проблемы со скриптом автоматической загрузки, предоставленным 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"
          }
      }
    }
  }

Надеюсь, это кому-то поможет!