使用PowerShell或批处理文件从FTP服务器删除超过X天的文件

时间:2016-07-27 15:13:24

标签: powershell batch-file ftp

我必须编写一个访问FTP服务器的脚本,然后删除超过X天的所有*.zip个文件。

澄清:脚本无法在FTP服务器上运行。

这是我到目前为止所做的:

$ftpServer = "RandomFTPServer"
$ftpUser = "Username"
$ftpPassword = Read-Host "Password" -AsSecureString

$credentials = New-ObjectSystem.Net.NetworkCredential($ftpUser, $ftpPassword)

function Get-FtpRequest($ftpPath) {
    $ftpRequest = [System.Net.FtpWebRequest]::Create("$ftpServer/$ftpPath")
    $ftpRequest.Credentials = $credentials
    $ftpRequest.UseBinary = $true 
    $ftpRequest.KeepAlive = $true
    $ftpRequest.UsePassive = $true
    return $ftpRequest
}

关于我接下来需要做什么的任何提示?

2 个答案:

答案 0 :(得分:4)

您必须检索远程文件的时间戳以选择旧文件。

不幸的是,由于它不支持FTP MLSD命令,因此没有真正可靠有效的方法来使用.NET framework / PowerShell提供的功能检索时间戳。

所以要么使用:

  • ListDirectoryDetails方法(FTP LIST命令)检索目录中所有文件的详细信息,然后处理FTP服务器特定格式的详细信息(* nix格式类似于ls * nix命令是最常见的,缺点是格式可能会随着时间而改变,对于较新的文件" 5月8日17:48"格式用于旧文件" 2009年10月18日&#34 ;格式使用)
  • GetDateTimestamp方法(FTP MDTM命令)单独检索每个文件的时间戳。优点是响应由RFC 3659标准化为YYYYMMDDHHMMSS[.sss]。缺点是你必须为每个文件发送一个单独的请求,这可能是非常低效的。

或者,您可以使用支持现代MLSD命令的第三方FTP客户端实现和/或内置支持来解析LIST命令的不同格式。

例如,WinSCP .NET assembly支持两者。

# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Ftp
    HostName = "ftp.example.com"
    UserName = "username"
    Password = "password"
}

try
{
    # Connect
    $session = New-Object WinSCP.Session
    $session.Open($sessionOptions)

    # List files
    $remotePath = "/remote/path"
    $directoryInfo = $session.ListDirectory($remotePath)

    # Find old files
    $limit = (Get-Date).AddDays(-15)

    $oldFiles =
        $directoryInfo.Files |
        Where-Object { -Not $_.IsDirectory } | 
        Where-Object { $_.LastWriteTime -lt $limit }

    # Delete them
    foreach ($oldFileInfo in $oldFiles)
    {
        $oldFilePath =
            [WinSCP.RemotePath]::EscapeFileMask($remotePath + "/" + $oldFileInfo.Name)
        $session.RemoveFiles($oldFilePath).Check()
    } 

    Write-Host "Done"
}
finally
{
    # Disconnect, clean up
    $session.Dispose()
}

如果您可以使用普通批处理文件,WinSCP scripting实际上更容易:

winscp.com /ini=nul /log=delete.log /command ^
    "open ftp://username:password@ftp.example.com/" ^
    "rm /remote/path/*<15D" ^
    "exit"

请参阅file masks with time constraints

(我是WinSCP的作者)

答案 1 :(得分:0)

我目前正在使用免费软件命令行工具FTPUSE执行此操作,该工具将FTP文件夹与Windows驱动器号一起映射,并通过以下方式将批处理文件映射到:

: delete files older than 7 days from ftp://my.ftpsite.net/folder/subfolder
ftpuse F: my.ftpsite.net password /USER:username
timeout /t 5
forfiles -p "F:\folder\subfolder" -s -m *.* -d -7 -c "cmd /C DEL @File /Q"
ftpuse F: /DELETE

该软件兼容所有主要版本的Windows:Windows XP,Vista,7,Server 2003,Server 2008,Windows 8,Server 2012和Windows 10(32位,64位)。

有关详细信息,您还可以阅读this post我写过有关FTPUSE的内容(我不是作者,我发现它对这些任务非常有用)。