1
votes

Windows CMD / BATCH Conserver le dernier fichier horodaté

J'ai quelques fichiers que je voudrais trier et conserver le fichier le plus récent. Je ne peux pas le faire par date d'attributs de fichier modifiés ou créés, ce que je ne pourrais pas faire de problème.

Voici la convention de dénomination des fichiers. FichierABC_YYYYMMDD.txt

  • FichierABC_20190201.txt
  • FichierABC_20190125.txt
  • FichierABC_20190118.txt
  • FichierABC_20190111.txt
  • FichierABC_20190104.txt

Vous pouvez voir que l'horodateur est dans le nom du fichier lui-même. Ces fichiers sont générés chaque semaine. Je voudrais donc avoir une boucle de fichier de commandes à travers eux et supprimer tous les fichiers, sauf la plupart des fichiers actuellement datés. J'ai vraiment cherché comment faire cela au mieux et je ne trouve pas grand-chose, j'ai donc besoin d'idées. Je préfère une solution cmd pure mais je suis également ouvert aux solutions PowerShell.


Ce que j'essaie moi-même, c'est d'analyser la date avec ...

if "%theDate%" GEQ "*****not sure what to put here*****" (
    del *all the old files, also not sure what to put here*
)  

Alors je veux prendre ces dates d'une manière ou d'une autre à partir des résultats de la boucle et faites quelque chose comme

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%G IN ('dir/b /a-d "C:\Users\thomas.maus\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName\FileABC_*.txt"') do (

            set fileName=%%G 
            Set theDate=!fileName:~8,8!
            echo !theDate!


)


5 commentaires

Les fichiers que vous avez fournis sont déjà classés par date, les plus récents en premier et les noms que vous leur avez attribués peuvent être triés par ordre alphabétique, ce qui signifie que les plus récents seront toujours répertoriés en premier ou en dernier en fonction de l'ordre de tri.


Je n'essaye pas de les commander ou de les trier vraiment. Je veux juste supprimer tous les fichiers sauf le plus récent. J'ai analysé les dates pour pouvoir essayer de faire des calculs pour obtenir la meilleure date, puis utiliser une sorte de logique pour supprimer tout ce qui est plus ancien que le plus récent.


Vous ne pouvez pas faire de maths sur une chaîne de texte, ce que vous pouvez faire est de diviser les noms au niveau du séparateur commun, de trier les fichiers sur la partie date et de les supprimer dans l'ordre trié ou trié inversé, sauf un!


Il y a de nombreux articles existants ici qui devraient pouvoir vous donner un bon départ. Essayez celles-ci, par exemple: stackoverflow.com/q/54657806/62576 et stackoverflow.com/q/44057048/62576


La partie FileABC peut-elle contenir un caractère _ seule?


4 Réponses :


1
votes

Que diriez-vous de ça?

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do echo %%i

Si vous voulez simplement le tester (voir ce qu'il supprimerait) d'abord, faites:

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do del %%i

p>


0 commentaires

1
votes

Nous parcourons les fichiers en boucle, triés par date dans l'ordre décroissant, puis ignorons le premier fichier, qui est maintenant le dernier:

@for /f "skip=1" %%a in ('dir /b /o-d *.txt') do @echo @del %%a

Important! p>

Cet exemple ne fera que faire écho à la commande de suppression comme mesure de sécurité afin de ne pas supprimer les fichiers que vous ne devriez pas avoir. Pour effectuer la suppression proprement dite, supprimez @echo de la ligne.

Pour en savoir plus sur les fonctions que nous avons utilisées, exécutez ce qui suit à partir de cmd.exe

  • pour /?
  • dir /?


0 commentaires

1
votes

Si vous ne vous souciez pas des dates des fichiers mais uniquement des dates dans les noms de fichiers, vous pouvez faire ce qui suit, étant donné que la partie FileABC est toujours la même et ne contient aucun _ seul:

pushd "C:\Users\thomas.maus\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName" && (
    for /F "skip=1 delims= eol=|" %%F in ('
        dir /B /A:-D "FileABC_????????.txt" ^
            ^| sort /R
    ') do (
        del "%%F"
    )
    popd
)

Bien que sort / R effectue un tri alphabétique, cela fonctionne en raison du format de date choisi, ce qui garantit cet ordre alphabétique équivaut à un alphanumérique.


0 commentaires

0
votes

Comme option supplémentaire, juste au cas où le préfixe du nom de fichier changerait d'un bout à l'autre et que seul le _YYYYMMDD.txt reste constant, vous pouvez toujours effectuer la tâche en utilisant cette date car elle est déjà triable par ordre alphabétique.

Voici un exemple:

@Echo Off
Set "SrcDir=%UserProfile%\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName"
For /F "Delims==" %%A In ('Set $ 2^>Nul') Do Set "%%A="
Set "_="
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt 2^>Nul'
) Do Set "_=%%~nA" & Call Set "$%%_:~-8%%=%%A"
If Not Defined _ Exit /B
For /F "Tokens=1* Delims==" %%A In ('Set $ 2^>Nul') Do Set "_=%%B"
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt^|Find /V "%_%"'
) Do Del /A /F "%%A"

Ceci utilise le fait que la commande Set affichera les variables dans l'ordre alphabétique.

  • Les lignes 2 à 4 définissent et dé-définissent simplement les variables que nous utiliserons.
  • Lignes 5 et 6 est une seule ligne répartie sur deux lignes pour plus de lisibilité. Cela définira les variables utilisant les huit derniers caractères des noms de base des fichiers, à la valeur du nom de fichier complet.
  • La ligne 7 est incluse pour quitter le script, juste au cas où aucun fichier .txt avec un nom de base se terminant par un trait de soulignement suivi de huit caractères n'a été trouvé dans l'ensemble de répertoires à la ligne 2 .
  • La ligne 8 est la spéciale ici, elle affiche chaque variable et la valeur correspondante dans l'ordre alphabétique. La sortie est définie sur une variable, qui se remplace jusqu'à la fin de la boucle. Cela signifie que le fichier le plus récent, le dernier par ordre alphabétique , est conservé avec la valeur du fichier nommé avec la date la plus récente.
  • Les
  • lignes 9 & 10 sont à nouveau une seule ligne divisée en deux pour plus de lisibilité. Cela boucle à nouveau tous les fichiers correspondants dans le répertoire et utilise la commande Rechercher pour exclure la sortie de celui qui correspond à celui contenu dans la variable en tant que fichier avec la date la plus récente. Chaque sortie de fichier est simplement supprimée à l'aide de la commande Del .

Veuillez noter que ce script suppose que vous n'avez qu'un seul fichier avec chaque date, car vous avez seulement indiqué que les fichiers sont générés chaque semaine.

p >


1 commentaires

Merci cela fait l'affaire, j'apprécie l'explication aussi.