Как проверить результат сценария ftp с файлом bat?

У меня есть .bat-файл, который запускает ftp-скрипт, захватывает файлы с сервера и копирует их на мою машину. Прекрасно работает.

Теперь я хочу, чтобы этот .bat-файл сообщал, произошла ли какая-либо из этих ошибок.

Если бы вы могли указать мне в правильном направлении на общее представление о том, как это сделать, это было бы здорово.

Благодарю.

Честно говоря, я никогда не имел большого успеха, используя фиксированные FTP-скрипты. Даже если вы имеете дело с кодами возврата, трудно понять, что пошло не так.

Я бы рекомендовал вместо этого использовать PowerShell или Python. Оба они имеют доступ к FTP-клиенту, который можно динамически контролировать. Вы точно будете знать, что сработало или не получилось, и иметь возможность решать проблему тогда и там.

Простой пример в PS

$url = "ftp://ftp.foo.com/bar.txt" $destination = "c:\foo\bar.txt" $wc = New-Object System.Net.WebClient $wc.DownloadFile($url, $destination) 

Если вам нужно делать более сложные вещи, я бы начал с просмотра http://msdn.microsoft.com/en-us/library/ms229718.aspx. Эти примеры приведены на C #, но их довольно легко преобразовать в PS.

Сценарий, построенный таким образом, может отображать каталог и цикл по файлам, загружающим те, которые вы хотите. Если есть какие-либо ошибки, вы можете обрабатывать их на уровне каждого файла, как вам нравится.

Вот как это сделать в BAT-файле.

Вызовите FTP, одновременно перенаправляя вывод и ошибки в отдельные файлы. Если файл ошибки не имеет значения, тогда возникает проблема.

Предполагая, что вы создали set переменных, называемых FTPFILE , OUTPUTFILE и ERRORFILE , тогда должно работать следующее:

  1. Вызовите FTP, захватив вывод и ошибки для разделения файлов.

     ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%" 
  2. Проверьте, не вызвал ли FTP-вызов

     if ERRORLEVEL 1 ( echo Call to ftp returned an error. See file: %OUTPUTFILE% exit /b 1 ) 
  3. Проверьте, есть ли в сеансе FTP ошибки. Сделайте это, проверив размер файла ошибки.

     FOR /F "usebackq" %%A IN ('%ERRORFILE%') DO set ERRORFILESIZE=%%~zA if %ERRORFILESIZE% GTR 0 ( echo Error while performing the FTP. See file: %ERRORFILE% exit /b 2 ) 

В то время как пример Шеза выше – хороший стандартный способ захвата ошибок из большинства программ на основе dos, которые устанавливают ERRORLEVEL и производят вывод из стандартной ошибки (2>), http://ftp.exe из коробки из MS не устанавливает ERRORLEVEL. ERRORLEVEL остается нулевым, удастся ли выполнить сценарий (-s: parameter) или сбой. Перенаправление стандартной ошибки (2>) в «% ERRORFILE%» не работает, так как этот файл всегда будет файлом с нулевым байтом (потому что http://ftp.exe всегда возвращает ERROR_SUCCESS или 0), поэтому создается только пустой файл. Итак, строка команды:

 ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%" 

Никогда не даст ожидаемых результатов. Если мы вынуждены использовать клиент Microsoft FTP, лучше всего проанализировать% OUTPUTFILE% для определенных текстовых строк, указывающих на ошибку, или использовать другой FTP-клиент, отличный от MS (например, IPSWITCH WS_FTP), который позволяет улучшить захват ошибок. Я буду следить за примерами кода, как разобрать через% OUTPUTFILE% через несколько часов, как только закончу кодирование его методом грубой силы. Благодаря!

Следовать за

См. Мой второй пост ниже для примера интерактивной сессии Microsoft FTP. Пример синтаксического анализа следующий … ОК, что следует, это вариант на странице Martijn S на сайте stackoverflow.com. Мое решение использует FINDSTR и отдельный текстовый файл, содержащий критерии поиска:

Создайте текстовый файл (FTP_ERR_SEARCH_CRITERIA.txt), содержащий следующие текстовые строки:

 not connected not found failed 

Вызовите следующую подпрограмму из файла пакета / команды:

 :: ::============================================================================= :WIN_FTP_ERROR %1=%_SearchCriteria% %2=%_InputFile% ::============================================================================= :: set _SearchCriteria=%1 set _InputFile=%2 set _tokens="tokens=*" for /F %_tokens% %%G in ('findstr /I /G:%_SearchCriteria% %_InputFile%') do @echo "%%G" exit /b 

Вызов:

 call :WIN_FTP_ERROR ".\FTP_ERR_SEARCH_CRITERIA.txt" %OUTPUTFILE% 

Пример вывода Microsoft FTP

Продолжая, где я остановился … Иногда лучший способ узнать, как что-то работает, – проверить его самостоятельно, а не полагаться на множество дезинформации, обнаруженных в Интернете. Итак, вот оно. В приведенном ниже примере показаны два разных файла: tst.txt и tst.tx (тонкая разница в названии, но разные одинаковые). Tst. Файл txt существует, пока tst. Tx нет.

Пример FTP-сервера Microsoft (добавленный для большей четкости):

 ftp> put tst.txt 200 PORT command successful. 150 Opening ASCII mode data connection for tst.txt. 226 Transfer complete. ftp: 44 bytes sent in 0.19Seconds 0.24Kbytes/sec. ftp> put tst.tx tst.tx: File not found ftp> get tst.tx 200 PORT command successful. 550 tst.tx: The system cannot find the file specified. ftp> get tst.txt 200 PORT command successful. 150 Opening ASCII mode data connection for tst.txt(44 bytes). 226 Transfer complete. ftp: 44 bytes received in 0.00Seconds 44000.00Kbytes/sec. 

Обратите внимание, как локальная файловая система и удаленная файловая система реагируют на приведенные выше команды:

Для первого положить tst. Txt (файл существует в локальной файловой системе), мы видим, что удаленный сервер отвечает передачей файла.

Для второго положить tst. Tx (файл tst.tx не существует в любой системе), мы видим, что локальная файловая система отвечает с именем файла tst.tx и сообщение об ошибке Файл не найден

Для третьего получить tst. Tx (опять же, файл tst.tx не существует), мы видим, что удаленная файловая система (фактически удаленный FTP-хост) отвечает кодом ошибки FTP 550 , именем файла tst.tx и сообщением об ошибке . Система не может найти указанный файл ,

Для четвертого и финального получения tst. Txt (файл теперь существует в удаленной системе), мы видим, что удаленная система отвечает успешной передачей.

Почему все это объяснение? Это важно, когда мы просматриваем файл в предыдущем сообщении, чтобы увидеть, что сообщения об ошибках возвращаются из MS http://ftp.exe.

Общим для консольных утилит является возврат некоторого кода, указывающего на ошибку, описанную здесь здесь . Если ftp выходит после некоторой ошибки, он, вероятно, возвращает ненулевой код, указывающий на ошибку. IMHO нет простого способа разобрать вывод программы в пакетных файлах, но вы можете проверить уровень ошибок и сохранить файл журнала (используя перенаправление выходного потока: command args >log ) или отправить его по электронной почте.

Это сообщение об ошибке является специфичной для FTP ошибкой и связано с тем, что ваш брандмауэр по умолчанию отключит FTP-соединения (это хорошо!).

Вы можете проигнорировать это сообщение, так как оно никак не повлияет на ваш компьютер.

  • Как установить фоновый рисунок рабочего стола в Windows из сценария?
  • Crontab, чтобы разбудить osx от сна
  • Удалить все файлы из папки и ее подпапок
  • Что эта команда: () {: |: &} ;: делает?
  • Добавить в начало имени файла
  • Простейшая настройка в Windows для отправки HTTP-запроса, получения и применения регулярного выражения к ответу и записи соответствия (output) для вывода файла
  • Установка даты создания файла в Mac OS X
  • Как запустить команду после загрузки?
  • Vbscript для автолога
  • Как извлечь полный список типов расширений внутри каталога?
  • SSH: выполнить команду sudo
  • Interesting Posts

    Как программно добавить элемент подменю в новую библиотеку поддержки Android

    Поиск файлов, модифицированных в определенных диапазонах даты и времени

    HRESULT: 0x800A03EC на рабочем листе.

    Google maps Marker Label с несколькими символами

    Копировать / Поместить текст в буфер обмена с помощью FireFox, Safari и Chrome

    Как восстановить раздел без потери данных?

    Как получить файл apk для сборки сборки с помощью proguard

    Значение <br типа java.lang.String не может быть преобразовано в JSONObject на android

    Какие расширения файлов поддерживает ffmpeg?

    Как я могу передавать аудиосигналы с разных устройств / компьютеров на мой домашний сервер?

    Пульт дистанционного управления Linux-клавиатура / мышь

    ResultSet: получение значений столбцов по индексу по сравнению с извлечением по метке

    Практика программирования в научной среде?

    Неожиданное невоимое возвращаемое значение в функции Void (Swift 2.0)

    Отправка и анализ объектов JSON в Android

    Давайте будем гением компьютера.