繁体   English   中英

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

[英]Delete files older than X days from FTP server with PowerShell or batch file

我必须编写一个访问 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
}

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

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

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

所以要么你使用:

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

一些参考:

尽管Microsoft 不建议将FtpWebRequest用于新开发


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

例如, WinSCP .NET 程序集支持两者。

# 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)
    {
        $session.RemoveFile($oldFileInfo.FullName).Check()
    } 

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

如果您可以使用普通的批处理文件,那么使用WinSCP 脚本实际上更容易:

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

请参阅具有时间限制的文件掩码

(我是 WinSCP 的作者)


请注意,WinSCP 不需要任何安装。 因此,您可以使用批处理文件或 PowerShell 脚本复制其二进制文件。

我目前正在使用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 位)。

有关更多信息,您还可以阅读我写的关于 FTPUSE 的这篇文章(无论如何,我不是作者,我只是发现它对此类任务非常有用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM