目录同步成功后,WinSCP 删除特定文件夹中早于特定日期的源文件

WinSCP delete source files in specific folders older than certain date, after successful Synchronization of directory

我有一个使用 WinSCP 同步特定文件夹的批处理文件。

"C:\Program Files (x86)\WinSCP\WinSCP.com" ^
  /log="C:\Scripts\Logs\- Server Data - Backup !M-!D-!Y.log" ^
  /command ^
    "open ""sftp://xxx/Archive/Server Data/"" " ^
    "synchronize remote ""C:\xxx\- Server Data -\"" " ^
    "exit"

其背后的要点是将数据存档到 Synology NAS SFTP 服务器。效果不错。

我还想删除源的特定子目录中超过特定​​日期(例如 30 天)的文件,但我想绝对确定它们已成功存档到 SFTP 服务器。

我有一个批处理文件可以删除超过 30 天的日志文件,但我认为这不是删除重要文件的安全方法。例如,假设同步可以在我不注意的情况下停止工作 30 天,然后我就完蛋了。

ForFiles /p "C:\Scripts\Logs" /s /d -30 /c "cmd /c del @file"

此外,如果指定的子目录可以轻松编辑,以便我可以简单地添加到列表或从列表中删除,那就太好了。所以我认为某种循环会很好。

最好的方法是什么?

您可以test WinSCP exit code,在开始删除文件之前查看同步是否成功:

"C:\Program Files (x86)\WinSCP\WinSCP.com" ^
  /log="C:\Scripts\Logs\- Server Data - Backup !M-!D-!Y.log" ^
  /command ^
    "open ""sftp://xxx/Archive/Server Data/"" " ^
    "synchronize remote ""C:\xxx\- Server Data -\"" " ^
    "exit"

if not errrolevel 1 (
    ForFiles /p "C:\Scripts\Logs" /s /d -30 /c "cmd /c del @file"
)

查看 WinSCP 常见问题解答 How do I know that script completed successfully?


要获得更强大的解决方案,您应该使用更强大的语言,例如 PowerShell combined with WinSCP .NET assembly

您可以从这个示例开始,它包含您需要的所有关键部分(迭代本地文件,并检查它们是否存在于远程):
Recursively move files in directory tree to SFTP server while preserving source directory structure.