2016-07-27 21 views
3

Ich muss ein Skript schreiben, die auf einen FTP-Server zugreift, und löscht dann alle *.zip Dateien, die älter als X Tage sind.Löschen Sie Dateien älter als X Tage vom FTP-Server mit PowerShell oder Batch-Datei

Zur Klarstellung: Das Skript kann nicht auf dem FTP-Server ausgeführt werden.

Dies ist, was ich bisher:

$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 
} 

Irgendwelche Tipps, was ich als nächstes tun müssen?

+2

Ich würde mehr Code erwarten, da Sie nichts tun, außer zu verbinden. –

Antwort

1

Sie müssen Zeitstempel von entfernten Dateien abrufen, um die alten auszuwählen.

Leider gibt es keine wirklich zuverlässige und effiziente Methode zum Abrufen von Zeitstempeln mit den von .NET Framework/PowerShell angebotenen Funktionen, da FTP MLSD nicht unterstützt wird.

Also entweder Sie verwenden:

  • ListDirectoryDetails Methode (FTP LIST Befehl) Details aller Dateien in einem Verzeichnis abrufen und Sie befassen sich dann mit FTP-Server spezifischen Format der Details (* nix ähnliches Format wie ls * Nix-Befehl ist die häufigste, Nachteil ist, dass das Format im Laufe der Zeit ändern kann, wie für neuere Dateien "8. Mai 17:48" Format verwendet wird und für ältere Dateien "18. Oktober 2009" Format verwendet wird)
  • GetDateTimestamp Methode (FTP MDTM Befehl) zum individuellen Abrufen von Zeitstempeln für jede Datei. Vorteil ist, dass die Antwort von RFC 3659 auf YYYYMMDDHHMMSS[.sss] standardisiert ist. Nachteil ist, dass Sie für jede Datei eine separate Anfrage senden müssen, was sehr ineffizient sein kann.

Alternativ können Sie 3rd-Party-FTP-Client-Implementierung verwenden, die für die Analyse verschiedene Formate des LIST Befehls, um den modernen MLSD Befehl und/oder hat eine integrierte Unterstützung unterstützt.

Zum Beispiel unterstützt WinSCP .NET assembly beide.

# 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() 
} 

Wenn Sie mit einer einfachen Batch-Datei zu tun, es ist eigentlich noch einfacher mit 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 See.

(ich bin der Autor von WinSCP)

+0

Leider darf ich keine Software von Drittanbietern verwenden, ich darf nur Powershell (mit .net), Batch und FTP Batch verwenden. – PJS

+0

Eines der Probleme, die ich mit "ListDirectoryDetails" hatte, ist, dass ich für Ordner und Dateien, die in der Ordnerhierarchie tiefer liegen, nichts Ähnliches wie den Parameter "-recurse" finden kann. – PJS

+0

Beachten Sie, dass WinSCP keine Installation erfordert. Sie können die Binärdateien einfach mit Ihrer Batch-Datei oder Ihrem PowerShell-Skript kopieren. –

0

Ich bin derzeit dieses FTPUSE mit zu tun, ein Freeware-Kommandozeilen-Tool, das einen FTP-Ordner zu einem Windows-Karten Laufwerksbuchstabe, zusammen mit einer Batch-Datei auf folgende Weise:

: 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 

die Software ist kompatibel mit allen gängigen Versionen von Windows: Windows XP, Vista, 7, Server 2003, Server 2008, Windows 8, Server 2012 und Windows 10 (32-Bit, 64 -Bit).

Für weitere Informationen können Sie auch lesen this post Ich schrieb über FTPUSE (Ich bin nicht der Autor in irgendeiner Weise, ich finde es nur sehr nützlich für diese Art von Aufgaben).

Verwandte Themen