我必须编写一个访问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
}
关于我接下来需要做什么的任何提示?
答案 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的内容(我不是作者,我发现它对这些任务非常有用)。