2017-05-09 1 views
1

Je suis nouveau à script par lots. Je dois supprimer tous les fichiers dans un dossier NE PAS contient un mot dans le fichierScript Batch pour supprimer les fichiers dans le dossier qui ne contient pas certains mots

trouvé ce code

@echo off 
setlocal 
pushd C:\Users\admin\Desktop\bat 
findstr /ip /c:"importantWord" *.txt > results.txt 
popd 
endlocal 

Alors, comment je peux la liste WHITE ces fichiers, et supprimer tous les autres? Ou je pense qu'il y a moyen facile avec juste vérifier si ! Contient et supprimer mais je ne sais pas comment?

Répondre

0

Cela devrait fonctionner:

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 
SET "pathToFolder=C:\FolderToEmpty" 
SET "wordToSearch=ImportantWord" 
FOR /F "tokens=*" %%F IN ('dir %pathToFolder% /b *.txt') DO (
    findstr /IP %wordToSearch% "%pathToFolder%\%%F">nul 
    IF !ERRORLEVEL!==1 (
     DEL /Q "%pathToFolder%\%%F" 
    ) 
) 

Vous devrez définir le chemin approprié dans le dossier que vous souhaitez supprimer les fichiers et remplacer ImportantWord avec la sous-chaîne que vous recherchez.

+0

Merci, cela fonctionne. Où dois-je spécifier les fichiers * .txt uniquement? – stupid

+0

Édité ma réponse pour * .txt seulement. – MichaelS

0

Soi-disant, ce problème pourrait être résolu d'une manière très simple combinaison de ces findstr commutateurs:/V qui montrent des résultats lorsque la chaîne de recherche est pas trouvé, et/M qui montrent juste le nom des fichiers; qui est:

@echo off 
setlocal 
cd C:\Users\admin\Desktop\bat 
for /F "delims=" %%a in ('findstr /ipvm /c:"importantWord" *.txt') do del "%%a" 

Malheureusement, la combinaison de commutateurs/V et/M ne fonctionnent pas correctement: le résultat de/V est basé sur lignes (pas fichiers), donc une modification de la méthode est nécessaire:

@echo off 
setlocal 
cd C:\Users\admin\Desktop\bat 

rem Create an array with all files 
for %%a in (*.txt) do set "file[%%a]=1" 

rem Remove files to preserve from the array 
for /F "delims=" %%a in ('findstr /ipm /c:"importantWord" *.txt') do set "file[%%a]=" 

rem Delete remaining files 
for /F "tokens=2 delims=[]" %%a in ('set file[') do del "%%a" 

Cette méthode est efficace, en particulier avec de gros fichiers, parce que findstr rapport de commande juste le nom des fichiers et arrêter la recherche après le premier match de chaîne.

0
@echo off 
setlocal 
set "targetdir=C:\Users\admin\Desktop\bat" 
pushd %targetdir% 
for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
findstr /i /p /v /c:"importantWord" "%%a" >nul 
if not errorlevel 1 echo del "%%a" 
) 
popd 
endlocal 

Pas vraiment sûr de ce que vous voulez faire avec /p fichiers - fichiers contenant des caractères non-ansi semblent revenir errorlevel 1 pour ces derniers. if not errorlevel 1 fera écho aux fichiers qui ne contiennent pas la chaîne requise - supprimer le echo pour réellement supprimer le fichier (s)