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.
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
semble ne plus pouvoir modifier mon commentaire. J'ai corrigé ce problème en supprimant le fichier via del ... txt – dEEkAy
@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