У меня есть задание агента SQL Server, которое планируется запускать ежедневно. Первый из двух шагов вызывает пакет SSIS, который записывает результаты запроса в файл. На втором этапе выполняется пакетный файл, который переименовывает файл, добавляя дату, загружает файл на FTP-сайт партнера, перемещает файл в каталог архива и очищает. Обычно это работает нормально.
Однако иногда уведомление об успешном завершении задания не отправляется. Когда я захожу на сервер, я вижу, что ftp.exe все еще работает, но файл не загружен и не перемещен в архив. Когда я завершаю процесс FTP, задание продолжается, перемещая файл и очищая его. Взгляд на историю работы показывает два разных сценария в этих неудачных случаях. Во-первых, соединение установлено, но последним видимым выводом FTP является 150 Opening data channel for file transfer.
— 226 Transfer OK
не существует, так как это означает успешное выполнение задания. Второй сценарий заключается в том, что соединение никогда не устанавливается, поэтому сценарий отключается и пытается войти в систему, когда соединение не открыто.
Вот скрипт с измененными хостом, пользователем и паролем:
@echo off
setlocal
D:
cd D:\Backups
set file_name=ssis_output.txt
set new_file_name=SDCL.%date:~-4,4%-%date:~-10,2%-%date:~-7,2%-00-00-00.txt
set user=XXXXXXXXXXXXX
set pass=XXXXXXXXXXXXX
set host=XXXXXXXXXXXXX
ren "%file_name%" "%new_file_name%"
echo user %user%> ftpcmd.dat
echo %pass%>> ftpcmd.dat
echo bin>> ftpcmd.dat
echo put %new_file_name%>> ftpcmd.dat
echo close>> ftpcmd.dat
echo bye>> ftpcmd.dat
ftp -n -s:ftpcmd.dat %host%
del ftpcmd.dat
move %new_file_name% data_files
Что я хотел бы сделать, так это найти способ включить обнаружение ошибок в пакетный файл, чтобы, если FTP-соединение либо не было установлено, либо истекло время ожидания до завершения передачи, сценарий распознал это и дал сбой, что позволяет завершить задание. и отправить соответствующее уведомление. Еще лучше, если сбой соединения приведет к нескольким дополнительным попыткам после соответствующих пауз, прежде чем, наконец, сдаться и сообщить об ошибке.
EDIT: я не возражаю против установки другого бесплатного FTP-клиента, такого как WinSCP, если это поможет найти решение.