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

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

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

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

спасибо.

8
задан Tommy
20.05.2023 22:12 Количество просмотров материала 3668
Распечатать страницу

5 ответов

честно говоря, я никогда не имел большого успеха, используя фиксированные 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.

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

4
отвечен Cephas 2023-05-22 06:00

вот как это сделать в файле 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
    )
    
2
отвечен Shez 2023-05-22 08:17

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

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

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

следовать-вверх

см. мой второй пост ниже для примера интерактивной сессии Microsoft FTP. Пример разбора следующий...Хорошо, что следует вариация на Martijn S сообщение on 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 (тонкая разница в названии, но разные точно так же). ТКТ.txt файл существует в то время как tst.tx нет.

пример Microsoft FTP (интервал добавлен для ясности):

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.

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

первый put tst.txt команда (файл существует в локальной файловой системе) мы видим что удаленный сервер отвечает передачей файла.

второй put tst.tx команда (файл tst.tx не существует ни в одной из систем) мы видим, что локальная файловая система отвечает именем файла tst.tx сообщение об ошибке файл не найден

третий get tst.tx команда (снова файл tst.tx не существует) мы видим, что удаленная файловая система (на самом деле удаленный FTP-сервер) отвечает код ошибки FTP 550 имя файла tst.tx сообщение об ошибке системе не удается найти указанный файл.

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

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

2
отвечен Mark Ronollo 2023-05-22 10:34

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

1
отвечен whitequark 2023-05-22 12:51

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

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

1
отвечен Hartmut Jager 2023-05-22 15:08

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх