У меня есть три системы, которые мне нужны для ежедневной передачи файлов:
Поставщик A (сайт SFTP) - удаляет файлы через 14 дней
Поставщик B (сайт SFTP) - удаляет файлы после их обработки
Сервер компании (Windows 2008) - хранит файлы как резервные копии.
Каждый день я хочу загружать новые файлы от поставщика A на сервер нашей компании и загружать их поставщику B. Предостережение при использовании простого сценария передачи файлов заключается в том, что передача файла от поставщика A на сервер компании может быть успешной, но не удастся при передаче из компании. сервер поставщику B. Таким образом, поставщику B не хватает файлов на несколько дней. Поставщик B не сообщает мне, когда у них отсутствуют файлы, а поставщик A не всегда создает файл в определенный день.
Есть идеи, как автоматизировать этот сценарий передачи файлов, чтобы в случае сбоя система повторила попытку позже?
Я бы сделал:
Повторяйте это не реже одного раза в день, возможно, несколько раз в день. Или делайте шаги 1-3 один раз в день, но шаги 4-6 несколько раз в день.
Возможная реализация с использованием PowerShell:
Использовать Сборка WinSCP .NET метод Session.SynchronizeDirectories
:
$synchronizationResult = $session.SynchronizeDirectories(
[WinSCP.SynchronizationMode]::Local, "c:\backup\", "/remote_path/", $False)
Итерировать SynchronizationResult.Downloads
и Copy-Item
каждый:
foreach ($download in $synchronizationResult.Downloads)
{
Copy-Item $download.Destination -Destination "C:\upload"
}
Использовать Get-ChildItem
чтобы найти последний файл:
# Find the latest file
$latest = Get-ChildItem "C:\backup" |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
# Is the latest file older than 5 days?
if ($latest.LastWriteTime -lt (Get-Date).AddDays(-5))
{
# alert!
}
Используйте метод сборки WinSCP .NET Session.PutFiles
:
$transferResult = $session.PutFiles("C:\upload\*.*", "/remote_path/")
Повторять TransferResult.Transfers
и Remove-Item
каждый:
foreach ($transfer in $transferResult.Transfers)
{
if ($transfer.Error -eq $Null)
{
Remove-Item $transfer.FileName
}
}
Протестируйте как SynchronizationResult.IsSuccess
и TransferResult.IsSuccess
(Я автор WinSCP)
Вам просто нужно добавить некоторую логику, чтобы повторить загрузку поставщику B через некоторый период времени. Если вы достигнете максимального количества сбоев, зарегистрируйте ошибку или отправьте электронное письмо, чтобы служба поддержки проверила ее вручную.
Если вы ожидаете, что поставщик A не будет генерировать файлы каждый день, определите, насколько важны недостающие дни, и решите, следует ли вам также генерировать предупреждение / электронное письмо для них или нет (например, вам нужно позвонить поставщику A, чтобы узнать, почему файл отсутствует. в ожидаемое время).