删除名称超过2天的远程.csv文件,其中包含时间戳

时间:2017-05-02 20:38:57

标签: batch-file ftp winscp

我正在尝试删除早于2天文件的FTP服务器中的远程(.csv)文件。

文件的最后修改时间没有正确设置。我不得不依赖他们名字的时间戳。

文件的命名类似于Sales_201705010315.csv(日期和时间)。

我目前的WinSCP脚本是:

option batch on
option confirm off
open login ftp credentials
cd /OUT
rm *<1D
exit

当我运行脚本时,文件不会被删除。有人可以请更正我的脚本

2 个答案:

答案 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"