пока 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.исполняемый.