2017-06-07 1 views
0

Je veux comparer certains fichiers dans un dossier, puis écrire ceux qui manquent dans un fichier texte.comparer des noms de fichiers avec .bat et écrire des entrées manquantes dans .txt

j'ai un dossier

c: \ sessions \

avec les fichiers qu'il contient. ces fichiers sont à la recherche comme:

Blabla-1111-FOO 
Blabla-1111-BAR1 
Bleble-2222-FOO 
Bleble-2222-BAR1 
Bleble-2222-BAR2 
Bleble-2222-BAR3 
Bleble-2222-BAR4 
Blublu-5678-FOO 
Blublu-5678-BAR1 
Blublu-5678-BAR2 
Blublu-5678-BAR3 
Blublu-5678-BAR4 
Blublu-5678-BAR5 
Bleble-6666-FOO 
Bloblo-7777-FOO 
Bloblo-8888-FOO 
Bloblo-9999-FOO 

i besoin d'un fichier .bat qui écrit tous les fichiers se terminant par -foo où aucun -BAR correspondant existe dans un noBARs.txt. Donc, dans ce cas, le noBARs.txt devrait ressembler à ceci:

Bleble-6666-FOO 
Bloblo-7777-FOO 
Bloblo-8888-FOO 
Bloblo-9999-FOO 

Il peut y avoir plusieurs fichiers -Bär qui appartiennent à un fichier -foo. Merci d'avance les gars.

Répondre

1

Vous pouvez essayer ce qui suit:

@echo off 

setlocal enabledelayedexpansion 
set "source=c:\sessions" 
set "output=noBARs.txt" 
set "find=*foo" 
set "repl=bar*" 

1>"%output%" (
    for %%e in ("%source%\%find%") do (
    set "file=%%e" 
    if not exist "!file:~0,-3!%repl%" (
     echo %%~ne 
    ) 
) 
) 

Cela itérer tous les fichiers qui contiennent *foo dans leur nom de fichier. Puis il remplace les 3 derniers caractères du nom de fichier par bar* et vérifie l'existence du fichier. Si le fichier bar correspondant n'existe pas, il écrira le nom de fichier d'origine dans le fichier de sortie noBARs.txt.


J'ai ajouté une autre version du script basé sur le dernier commentaire de Deekay dans lequel il déclare que les fichiers se terminant par FOO suivie d'une constante numérique doivent être vérifiés. Je ne suis toujours pas sûr de l'intention exacte de dEEkAy mais je suppose que les noms de fichiers *FOO* doivent être traités de la même manière que *FOO.

L'entrée suivante:

Blabla-1111-FOO 
Blabla-1111-BAR1 
Bleble-2222-FOO 
Bleble-2222-BAR1 
Bleble-2222-BAR5 
Blublu-3333-FOO6 
Blublu-3333-BAR1 
Blublu-5678-FOO 
Blublu-5678-FOO1 
Blublu-5678-BAR2 
Blublu-5678-BAR4 
Bleble-6666-FOO 
Bloblo-7777-FOO5 
Bloblo-7777-BAR8 
Bloblo-9999-FOO 
Blublu-9999-FOO9 
Bloblo-!^^!-FOO 

produira la sortie suivante:

Bleble-6666-FOO 
Bloblo-!^^!-FOO 
Bloblo-9999-FOO 
Blublu-9999-FOO9 

La version alternative du script est aussi plus robuste que l'original. Il devrait maintenant être capable de gérer les noms de fichiers et les chemins qui contiennent des points d'exclamation et des carets de façon appropriée. Malheureusement, cela a un coût. En raison de la commande call qui sera exécutée pour chaque itération de la boucle for, le script est devenu beaucoup plus lent. Peut-être que quelqu'un avec plus d'expérience de script de fichiers batch peut trouver une meilleure solution.

@echo off 

setlocal disabledelayedexpansion 
set "source=c:\sessions" 
set "output=noBARs.txt" 
set "find=foo" 
set "repl=bar" 

1>"%output%" (
    for %%e in ("%source%\*%find%*") do (
    set "path=%%~dpe" 
    set "file=%%~ne" 

    setlocal enabledelayedexpansion 
    call :ReplaceEndOfString file match "%find%" "%repl%" 

    if not exist "!path!!match!*" (
     echo !file! 
    ) 
    endlocal 
) 
) 
exit /b 

:ReplaceEndOfString (__in *source, __out *dest, __in find, __in repl) { 
    set "temp=!%1:*%~3=%~3!" 
    set "%2=!%1:%temp%=%~4!" 
    exit /b 
} 

Gardez à l'esprit que "%source%\*%find%*" correspond à tout fichier qui contient %find% dans son nom de fichier, alors que "%source%\*%find%?" correspond uniquement les noms de fichiers qui se terminent par %find% dont un caractère facultatif qui pourrait être quelque chose.

+0

Merci mon ami. Vous m'avez sauvé beaucoup de tracas. Votre solution fonctionne parfaitement. Je n'ai eu qu'à changer cette partie à côté de -3!% Match% à -4 cause dans mon problème réel, j'ai eu des noms un peu différents. est-il un moyen d'écraser le fichier de sortie au lieu d'ajouter chaque fois que je lance ce lot? – dEEkAy

+0

semble ne plus pouvoir modifier mon commentaire. J'ai corrigé ce problème en supprimant le fichier via del ... txt – dEEkAy

+0

@dEEkAy J'ai modifié le script en conséquence. Chaque fois qu'il est exécuté, le fichier de sortie sera écrasé. Ce sera également beaucoup plus rapide si le répertoire source contient beaucoup de fichiers. N'hésitez pas à marquer mon message comme réponse si cela vous a aidé à résoudre votre problème. – treintje