你必須獲取遠程文件的時間戳來選擇舊的。
不幸的是,使用.NET Framework/PowerShell提供的功能檢索時間戳沒有真正可靠和有效的方法,因爲它不支持FTP MLSD
命令。
因此,無論你使用:
ListDirectoryDetails
方法(FTP LIST
命令)來檢索目錄中的所有文件的詳細信息,然後你處理的細節FTP服務器的特定格式(類似於ls
* nix的格式* nix的命令是最常見的,缺點是格式可隨時間變化,對於較新的文件「5月8日17點48分」的格式被用於和較舊的文件「二○○九年十月一十八日」格式時)
GetDateTimestamp
方法(FTP MDTM
命令)單獨檢索每個文件的時間戳。優點是響應標準化爲RFC 3659至YYYYMMDDHHMMSS[.sss]
。缺點是你必須爲每個文件發送一個單獨的請求,效率很低。
另外,您可以使用支持現代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)
{
$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:[email protected]/"^
"rm /remote/path/*<15D"^
"exit"
見file masks with time constraints。
(我的WinSCP的作者)
我猜想更多的代碼是非正式的,因爲除了連接之外你什麼都不做。 –