Сочетание RoboCopy с FtpUse

Вопрос или проблема

Нашим клиентам необходимо передавать определенные файлы из своей сети в нашу через FTP. Передача должна вызываться автоматически каждый раз, когда один из заданных файлов изменяется. Для этой цели идеально подходит RoboCopy. Однако RoboCopy не поддерживает передачу на FTP-адреса. Поэтому я хотел бы смонтировать наш FTP-сайт на букву диска на сервере клиента. Я обнаружил, что FtpUse идеально подходит для монтирования FTP как буквы диска. Монтирование работает, как и ожидалось, и я могу видеть содержимое FTP-сайта в проводнике Windows – я также могу записывать данные на смонтированный FTP-диск.

Предположим, я смонтировал FTP-сайт на диск Q на своем локальном компьютере с помощью этой команды:

ftpuse Q: [ftp address] [password] /USER:[username]

И пытаюсь настроить RoboCopy с помощью этой команды:

robocopy [source dir] Q:\ *.xls *.xlsx /COPY:DAT /LOG+:"[LogDir]\FtpCopyLog.txt" /V /NP /MON:1 /MOT:1 /R:10 /W:30 

Когда RoboCopy запускается, он завершает работу с следующим сообщением об ошибке:

ОШИБКА 87 (0x00000057) Копирование файла [source dir]\test2.xlsm
Параметр неверен

Я пытался смонтировать диск и запустить команду RoboCopy под той же учетной записью пользователя, но это, похоже, не решает проблему.

Надеюсь, кто-то сможет помочь.

Буду признателен за любую помощь.

Попробуйте использовать WinSCP в режиме зеркала. WinSCP можно скачать отсюда:

http://winscp.net/eng/download.php

Используя WinSCP, вам не нужно монтировать диск, он просто подключается к FTP напрямую и выполняет работу за вас.

Вот небольшой BAT-скрипт, который делает это похоже на ROBOCOPY.

ОСТОРОЖНО: я добавил опцию -delete, которая удаляет удаленные файлы, которые больше не соответствуют локальной папке. Двойные кавычки необходимы, потому что в локальном пути есть пробелы.

set FTPSERVER=v2008  
set FTPUSER=username  
set FTPPASS=password  
set FTPLOCALE=C:\Users\User\Desktop\Local folder  
set FTPREMOTO=/public  
winscp.com /command "open ftp://%FTPUSER%:%FTPPASS%@%FTPSERVER%/" ^
  "synchronize remote -delete ""%FTPLOCALE%"" %FTPREMOTO%"

Когда выполняется копирование, у вас есть разрешение на создание файлов, но нет разрешения на их перезапись. Какого размера файлы? Судя по тому, что я понимаю, каждый раз, когда файл редактируется, он копируется заново целиком, и вы перезаписываете старый файл новой версией. Нельзя ли определить, что именно изменилось в файле, и просто добавить новые данные? Поскольку вы не пытаетесь добавлять данные, а используемые вами инструменты не позволяют перезаписывать файл, вы могли бы теоретически написать какой-то промежуточный скрипт, который удаляет устаревшие файлы, когда они обнаруживаются сразу перед копированием нового файла на место. Это звучит как громоздкое решение, но вся ситуация также кажется громоздким процессом. Лично я бы переоценил, какова здесь цель, но я стараюсь ответить на вопрос. Удачи!

Поскольку вы уже используете Windows, почему бы не использовать PowerShell для этого? Вы можете указать только новые файлы и запланировать задачу с помощью планировщика задач Windows, всё с помощью встроенных инструментов Windows. Нет необходимости платить за встроенную функциональность. Я предполагаю, что это не защищенное FTP-соединение, которое вы используете. Небольшое скриптование даст вам очень гибкое и дешевое решение. У меня есть несколько скриптов PowerShell, которые извлекают и отправляют FTP-файлы на основе определенных критериев.

Ответ или решение

Использование RoboCopy вместе с FtpUse для автоматической передачи файлов по FTP

В современных условиях бизнеса многие компании сталкиваются с необходимостью передачи данных между различными сетевыми службами и серверами. Один из распространенных сценариев заключается в автоматической передаче файлов по протоколу FTP. Однако, как показывает практика, недостатки программ, такие как RoboCopy, требуют поиска альтернативных решений. В данной статье мы рассмотрим, как совместить возможности RoboCopy с FtpUse для автоматизации передачи файлов, а также альтернативные подходы к этой задаче.

Задача

Ваш клиент требует автоматической передачи определённых файлов с их сетевого ресурса на ваш сервер через FTP. RoboCopy отлично подходит для синхронизации файлов локально, однако не поддерживает передачу по FTP. Решение заключается в создании маппинга FTP-сайта в виде диска, что позволяет использовать возможности RoboCopy для передачи файлов.

Решение с использованием FtpUse

  1. Mapping FTP as a Network Drive
    Для начала вам потребуется выполнить команду маппинга FTP-диска. Пример команды:

    ftpuse Q: [ftp address] [password] /USER:[username]

    Эта команда устанавливает соединение с вашим FTP-сервером и отображает его как диск Q: в Windows.

  2. Настройка RoboCopy
    Далее, вы можете использовать RoboCopy для синхронизации файлов с уже смонтированным FTP-диском. Однако вы столкнулись с ошибкой:

    ERROR 87 (0x00000057) Copying File [source dir]\test2.xlsm
    The parameter is incorrect

    Это может указывать на различные проблемы, такие как:

    • Некорректные параметры команды RoboCopy.
    • Неправильные права доступа к маппированному диску.
    • Ограничения, связанные с программным обеспечением FTP.

    Ваша команда может выглядеть следующим образом:

    robocopy [source dir] Q:\ *.xls *.xlsx /COPY:DAT /LOG+:"[LogDir]\FtpCopyLog.txt" /V /NP /MON:1 /MOT:1 /R:10 /W:30

    Проверьте правильность указания параметров. Возможно, стоит попробовать ограничения по количеству пытающихся итераций, изменив значения /R и /W, чтобы убедиться, что это не проблема тайминга.

Альтернативное решение с использованием WinSCP

Поскольку RoboCopy может столкнуться с проблемами при работе с FTP, стоит рассмотреть использование такой программы, как WinSCP. Ее возможности позволяют подключаться к FTP-серверу напрямую и выполнять операции синхронизации.

Вот простой пример BAT-скрипта для WinSCP:

set FTPSERVER=v2008  
set FTPUSER=username  
set FTPPASS=password  
set FTPLOCALE=C:\Users\User\Desktop\Local folder  
set FTPREMOTO=/public  
winscp.com /command "open ftp://%FTPUSER%:%FTPPASS%@%FTPSERVER%/" ^
  "synchronize remote -delete ""%FTPLOCALE%"" %FTPREMOTO%"

Этот скрипт синхронизирует локальные файлы на FTP-сервер без необходимости маппирования диска. Параметр -delete позволяет удалять файлы на сервере, если они отсутствуют в локальной папке. Будьте осторожны с использованием этого параметра, чтобы избежать случайной потери данных.

Рассмотрение PowerShell как средства автоматизации

Если вы предпочитаете использовать встроенные возможности Windows, PowerShell может стать отличным инструментом для этой задачи. В PowerShell можно написать скрипты для загрузки и скачивания файлов с FTP-сервера, что обеспечит большую гибкость и контроль. С помощью PowerShell вы также сможете установить задачи в Планировщике заданий Windows для автоматического запуска скрипта при изменении файлов.

Пример простого скрипта может выглядеть следующим образом:

$ftp = "ftp://[ftp address]"
$username = "[username]"
$password = "[password]"
$localPath = "C:\local\path\to\files"
$remotePath = "/remote/path"

# Дополнительный код для подключения и передачи файлов

Заключение

Автоматизация передачи файлов через FTP является важной задачей для многих предприятий. Использование RoboCopy в комбинации с FtpUse, хотя и возможно, может встречать некоторые ограничения. Альтернативные решения, такие как WinSCP и PowerShell, предлагают более простые и надежные способы синхронизации файлов. Выбор метода зависит от архитектуры вашей системы и специфики задач, которые необходимо решить.

Рекомендуем исследовать все доступные варианты для реализации наиболее эффективного и безопасного решения.

Оцените материал
Добавить комментарий

Капча загружается...