我每天需要在三个系统之间传输文件:
供应商 A(SFTP 站点)- 14 天后删除文件
供应商 B(SFTP 站点)- 处理文件后删除它们
公司服务器 (Windows 2008) - 将文件存储为备份
我每天都想从供应商 A 下载新文件到我们公司的服务器,然后将其上传到供应商 B。使用简单文件传输脚本的缺点是,从供应商 A 到公司服务器的文件传输可能会成功,但从公司服务器传输到供应商 B 时可能会失败。因此,供应商 B 丢失了一天的文件。供应商 B 不会告诉我他们何时丢失了文件,而供应商 A 并不总是在某一天生成文件。
关于如何自动化此文件传输场景的任何想法,以便在发生故障时系统可以稍后再试?
答案1
您只需添加一些逻辑,在一段时间后重试上传到供应商 B。如果失败次数达到最大次数,请记录错误或发送电子邮件,让支持团队手动验证。
如果您预计供应商 A 不会每天生成文件,请确定缺失的日子有多重要,然后决定是否也应该为这些日子生成警报/电子邮件(例如,您必须致电供应商 A 以检查文件在预期时间丢失的原因)。
答案2
我会做:
- 文件的单向同步(供应商 A -> 公司服务器“备份”文件夹)。
- 将新下载的文件克隆到包含要上传的文件的单独文件夹(“上传”文件夹)。
- 检查“备份”文件夹中的最新文件有多旧。如果超过 X 天,则发出警报。
- 尝试将所有(不仅仅是新)文件从“上传”文件夹上传到供应商 B
- 从“上传”文件夹中删除已成功上传的文件
- 对任何(下载或上传)错误发出警报
每天至少重复一次,最好是几天。或者每天重复步骤 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 的作者)