リモートファイルのタイムスタンプを取得して古いものを選択する必要があります。
残念ながら、FTP MLSD
コマンドをサポートしていないため、.NETフレームワーク/ PowerShellの機能を使用してタイムスタンプを取得する方法はありません。
だからあなたが使用し、次のいずれかのディレクトリ内のすべてのファイルの詳細を取得するために
ListDirectoryDetails
方法(FTP LIST
コマンド)を、次にあなたがls
に似た内容のFTPサーバ固有のフォーマット(* nixのフォーマットを扱います* nixコマンドは最も一般的な欠点ですが、新しいファイル "May 8 17:48"形式が使用され、古いファイル "Oct 18 2009"形式が使用されているように、フォーマットは時間とともに変化する可能性があります)
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のの著者です)
あなたは何もしないで接続するので、私はより多くのコードを手に入れているはずです。 –