我正在尝试删除早于2天文件的FTP服务器中的远程(.csv)文件。
文件的最后修改时间没有正确设置。我不得不依赖他们名字的时间戳。
文件的命名类似于Sales_201705010315.csv
(日期和时间)。
我目前的WinSCP脚本是:
option batch on
option confirm off
open login ftp credentials
cd /OUT
rm *<1D
exit
当我运行脚本时,文件不会被删除。有人可以请更正我的脚本
答案 0 :(得分:0)
请注意,FTP服务器上的文件将具有在FTP服务器上创建文件的日期/时间,而不是原始文件的日期/时间。因此,如果您的文件是通过一夜之间运行的自动化任务传输的,则FTP服务器的日期/时间可能会有所不同。如果FTP服务器上的日期/时间未同步到时间服务器,您将遇到同样的问题。如果FTP发送机和接收机位于不同的时区,您可能会遇到此问题。
答案 1 :(得分:0)
这确实会删除“超过1天”的文件(不是2天):
rm *<1D
请参阅file mask with time contraints。
但该语法使用文件修改时间。
另见Delete files older than X days from FTP server with PowerShell or batch file。
如果您需要根据名称中的时间戳选择文件,则会更复杂。
删除时间戳为2天的文件很容易:
rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv
这使用%TIMESTAMP%
syntax with a relative time。语法将使命令解析为(截至2017-05-04):
rm Sales_20170502????.csv
但是这不会删除3天以上的文件。如果你每天定期运行脚本,那不是问题。如果您想要满足1天或几天的中断,您可以删除时间戳为2,3,4 ......天的文件,如:
rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv
rm Sales_%TIMESTAMP-3D#yyyymmdd%????.csv
rm Sales_%TIMESTAMP-4D#yyyymmdd%????.csv
...
如果你真的想删除时间戳为2天以上的所有文件,你必须编写脚本是一种更强大的语言。
PowerShell with use of WinSCP .NET assembly中的示例:
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions
# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Ftp
HostName = "ftp.examle.com"
UserName = "username"
Password = "password"
}
# Connect
Write-Host "Connecting..."
$session = New-Object WinSCP.Session
$session.Open($sessionOptions)
Write-Host "Listing files..."
$remotePath = "/OUT"
$files = $session.ListDirectory($remotePath).Files
$prefix = "Sales_"
$twoDaysBack = (Get-Date).AddDays(-2)
$timestamp = $twoDaysBack.ToString("yyyyMMdd")
foreach ($file in $files)
{
if (($file.Name.Length -gt ($prefix.Length + $timestamp.Length)) -and
($file.Name.SubString(0, $prefix.Length) -eq $prefix) -and
($file.Name.SubString($prefix.Length, $timestamp.Length) -le $timestamp))
{
$path = [WinSCP.RemotePath]::EscapeFileMask($file.FullName)
$session.RemoveFiles($path).Check()
Write-Host "Deleted $($file.Name)"
}
}
Write-Host "Done"