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

4

我需要编写一个脚本,访问一个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个回答

5
你需要检索远程文件的时间戳以选择旧文件。
不幸的是,使用.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命令的第三方FTP客户端实现。

例如,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)
    {
        $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"

请查看带时间限制的文件掩码。 < p > (我是WinSCP的作者)


请注意,WinSCP不需要安装。因此,您可以将其二进制文件与批处理文件或PowerShell脚本一起复制。

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位)。
如需进一步了解,请阅读我关于FTPUSE的这篇帖子(我并非作者,但我发现它在这类任务中非常有用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接