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

46scxncf  于 2023-11-20  发布在  .NET
关注(0)|答案(2)|浏览(154)

我必须写一个脚本,访问FTP服务器,然后删除所有的*.zip文件,这是旧的X天。
说明:该脚本不能在FTP服务器上运行。
这是我目前所拥有的:

  1. $ftpServer = "RandomFTPServer"
  2. $ftpUser = "Username"
  3. $ftpPassword = Read-Host "Password" -AsSecureString
  4. $credentials = New-ObjectSystem.Net.NetworkCredential($ftpUser, $ftpPassword)
  5. function Get-FtpRequest($ftpPath) {
  6. $ftpRequest = [System.Net.FtpWebRequest]::Create("$ftpServer/$ftpPath")
  7. $ftpRequest.Credentials = $credentials
  8. $ftpRequest.UseBinary = $true
  9. $ftpRequest.KeepAlive = $true
  10. $ftpRequest.UsePassive = $true
  11. return $ftpRequest
  12. }

字符串
有没有关于我下一步该做什么的提示?

dfddblmv

dfddblmv1#

您必须检索远程文件的时间戳,以选择旧的。
不幸的是,没有真正可靠和有效的方法来使用.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 does not recommend FtpWebRequest for a new development无论如何
或者,您可以使用支持现代MLSD命令和/或内置支持解析不同格式的LIST命令的第三方FTP客户端实现。
例如,WinSCP .NET assembly支持两者。

  1. # Load WinSCP .NET assembly
  2. Add-Type -Path "WinSCPnet.dll"
  3. # Setup session options
  4. $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
  5. Protocol = [WinSCP.Protocol]::Ftp
  6. HostName = "ftp.example.com"
  7. UserName = "username"
  8. Password = "password"
  9. }
  10. try
  11. {
  12. # Connect
  13. $session = New-Object WinSCP.Session
  14. $session.Open($sessionOptions)
  15. # List files
  16. $remotePath = "/remote/path"
  17. $directoryInfo = $session.ListDirectory($remotePath)
  18. # Find old files
  19. $limit = (Get-Date).AddDays(-15)
  20. $oldFiles =
  21. $directoryInfo.Files |
  22. Where-Object { -Not $_.IsDirectory } |
  23. Where-Object { $_.LastWriteTime -lt $limit }
  24. # Delete them
  25. foreach ($oldFileInfo in $oldFiles)
  26. {
  27. $session.RemoveFile($oldFileInfo.FullName)
  28. }
  29. Write-Host "Done"
  30. }
  31. finally
  32. {
  33. # Disconnect, clean up
  34. $session.Dispose()
  35. }

字符串
如果你可以处理一个普通的批处理文件,那么使用WinSCP scripting实际上更容易:

  1. winscp.com /ini=nul /log=delete.log /command ^
  2. "open ftp://username:[email protected]/" ^
  3. "rm /remote/path/*<15D" ^
  4. "exit"


请参见具有时间约束的文件掩码。

  • (我是WinSCP的作者)*

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

展开查看全部
oewdyzsn

oewdyzsn2#

我目前正在使用FTPUSE,一个免费的命令行工具,它将FTP文件夹Map到Windows驱动器号,并通过以下方式将批处理文件Map到Windows驱动器号:

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

字符串
该软件与所有主要版本的Windows兼容:Windows XP,Vista,7,Server 2003,Server 2008,Windows 8,Server 2012和Windows 10(32位,64位)。
要了解更多信息,你也可以阅读我写的关于FTPUSE的this post(我不是作者,我只是觉得它对这类任务非常有用)。

相关问题