2017-05-02 5 views
1

J'essaie de supprimer les fichiers distants (.csv) du serveur FTP de plus de 2 jours.Suppression de fichiers .csv distants avec horodatage dans leurs noms de plus de 2 jours

La dernière heure de modification des fichiers n'a pas été définie correctement. Je dois compter sur un horodatage dans leurs noms.

La dénomination du fichier est similaire à Sales_201705010315.csv (date et heure).

Mon script actuel WinSCP est:

option batch on 
option confirm off 
open login ftp credentials 
cd /OUT 
rm *<1D 
exit 

Quand je lance le script, les fichiers ne sont pas supprimer. Est-ce que quelqu'un peut corriger mon script?

+0

Comment vous exécutez le fichier txt? Cela ressemble à un script WinSCP, mais vous n'avez pas mentionné WinSCP + Quelle est la question? Le script a l'air bien. Si cela ne fonctionne pas comme vous le souhaitez, vous devez nous dire ce qui ne va pas! + Pourquoi utilisez-vous '* <1D', si vous voulez sélectionner des fichiers de 2 jours? + Pouvez-vous vraiment sélectionner les fichiers par leur heure de modification? Parce que votre message indique que les fichiers ont des horodatages dans leurs noms.Ce n'est pas la même chose que l'heure de modification du fichier, utilisée par le '* <1D'. Est-ce que les heures de modification du fichier correspondent à l'horodatage dans les noms de fichiers ou non? –

+0

Bonjour, je cours le fichier .txt en utilisant le fichier sales.bat. Le script txt fonctionne correctement sauf pour la section rm. Au début j'ai donné rm * .csv alors tous les fichiers ont été supprimés. Ma question est que j'ai besoin de supprimer les fichiers de 2 jours. pouvez-vous m'aider à supprimer ces fichiers en fonction du nom de mon fichier (sales_201705010315) – swetha

+0

Il n'est donc pas possible de sélectionner les fichiers en fonction de la date de modification du fichier? –

Répondre

0

Sachez que le fichier sur le serveur FTP aura la date et l'heure de la création du fichier sur le serveur FTP, et non la date et l'heure du fichier d'origine. Donc, si votre fichier a été transféré par une tâche automatisée exécutée pendant la nuit, la date/heure du serveur FTP peut être différente. Si la date/heure sur le serveur FTP n'est pas synchronisée avec un serveur de temps, vous rencontrerez le même problème. Et vous pouvez rencontrer le problème si la machine d'émission FTP et la machine de réception sont dans des fuseaux horaires différents.

+0

* "Sachez que le fichier sur le serveur FTP aura la date/heure de création du fichier sur le serveur FTP, et non la date/heure du fichier d'origine" * - Comment le savez-vous? Cela dépend de l'uploader. –

+0

l'ai eu. J'ai essayé de courir comme rm %% timestamp -1d # yyyymmddhhss %%. Mais cela n'a pas non plus supprimé ces fichiers. Pouvez-vous m'aider comment changer le script pour correspondre – swetha

+0

"Comment savez-vous?" A en juger par son code de suppression, je suppose qu'il utilise quelque chose de similaire à télécharger les fichiers et que ce serait un FTP mis. Il n'a mentionné aucun autre logiciel mais c'est un point valable. – thx1138v2

0

Cela fait supprimer des fichiers "de plus de 1 jour" (pas 2 jours):

rm *<1D 

Voir file mask with time contraints.

Mais cette syntaxe utilise le temps de modification de fichier.

Voir également Delete files older than X days from FTP server with PowerShell or batch file.

Si vous devez sélectionner les fichiers en fonction de l'horodatage dans leurs noms, c'est plus compliqué.


Il est facile de supprimer des fichiers avec un horodatage 2 jours:

rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv 

Il utilise %TIMESTAMP% syntax with a relative time. La syntaxe fera la détermination de commande (au 04/05/2017):

rm Sales_20170502????.csv 

Mais cela ne supprimera pas les fichiers 3 jours et plus vieux. Ce n'est pas un problème, si vous exécutez le script régulièrement tous les jours. Si vous souhaitez répondre à 1 ou quelques jours de pannes, vous pouvez supprimer des fichiers avec horodatage 2, 3, 4 ... jours comme:

rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv 
rm Sales_%TIMESTAMP-3D#yyyymmdd%????.csv 
rm Sales_%TIMESTAMP-4D#yyyymmdd%????.csv 
... 

Si vous voulez vraiment supprimer tous les fichiers avec timestamp 2 et plus vieux jours, vous devez écrire le script est un langage plus puissant.

Exemple dans PowerShell with use of WinSCP .NET assembly:

# Load WinSCP .NET assembly 
Add-Type -Path "WinSCPnet.dll" 

# Setup session options 
$sessionOptions = New-Object WinSCP.SessionOptions 

# Set up session options 
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{ 
    Protocol = [WinSCP.Protocol]::Ftp 
    HostName = "ftp.examle.com" 
    UserName = "username" 
    Password = "password" 
} 

# Connect 
Write-Host "Connecting..." 
$session = New-Object WinSCP.Session 
$session.Open($sessionOptions) 

Write-Host "Listing files..." 
$remotePath = "/OUT" 
$files = $session.ListDirectory($remotePath).Files 

$prefix = "Sales_" 
$twoDaysBack = (Get-Date).AddDays(-2) 
$timestamp = $twoDaysBack.ToString("yyyyMMdd") 

foreach ($file in $files) 
{ 
    if (($file.Name.Length -gt ($prefix.Length + $timestamp.Length)) -and 
     ($file.Name.SubString(0, $prefix.Length) -eq $prefix) -and 
     ($file.Name.SubString($prefix.Length, $timestamp.Length) -le $timestamp)) 
    { 
     $path = [WinSCP.RemotePath]::EscapeFileMask($file.FullName) 
     $session.RemoveFiles($path).Check() 
     Write-Host "Deleted $($file.Name)" 
    } 
} 

Write-Host "Done"