2016-07-11 3 views
1

Ich habe eine Batch-Datei, die meine Ordner gegen eine Dateiliste recursiert und grundsätzlich zwei Berichte erstellt. Eine wenn eine Datei existiert und eine wenn eine Datei nicht existiert. Was ich jetzt tun möchte, ist herauszufinden, ob eine Datei in den Verzeichnissen existiert, aber nicht in der Dateiliste existiert (d. H. Ich habe extra Dateien).Batch-Datei, um zu prüfen, ob Dateien in einem Verzeichnis existieren, die nicht in einer Dateiliste existieren

Hier ist meine aktuelle Datei ..

FOR /F "usebackqdelims=" %%f IN ("filelist.txt") DO (IF EXIST "%%f" (ECHO %%f exists >> "%~dp0\Exists.txt") ELSE (ECHO %%f doesn't exist >> "%~dp0\doesntexist.txt")) 
+0

Sie könnten in der 'findstr' Befehl interessieren:' findstr/X/L/C: "Dateiname" "filelist.txt" 'gibt einen' ErrorLevel' von '0' bei 'file_name' hat wurde sonst in 'filelist.txt' und' 1' gefunden; Geben Sie 'findstr /?' in ein Eingabeaufforderungsfenster für Hilfe ... – aschipfl

Antwort

1

Die Standard-Windows-Konsolenanwendung FINDSTR für diese Aufgabe ist auf jeden Fall eine sehr gute Wahl, da sie unten durch den Code zu sehen ist.

@echo off 
setlocal 
set "ListFiles=%~dp0FileList.txt" 
set "ListExist=%~dp0Exist.txt" 
set "ListMissing=%~dp0NotExist.txt" 
set "ListExtra=%~dp0Extra.txt" 
set "ListCurrent=%TEMP%\ListCurrent.tmp" 

rem Get list of all files in current directory and its subdirectories with 
rem full path into a temporary list file. If the current directory tree 
rem contains no file, delete empty list file and exit batch processing. 
dir /A-D /B /ON /S >"%ListCurrent%" 2>nul 

if errorlevel 1 (
    copy "%ListFiles%" "%ListMissing%" >nul 
    if exist "%ListExist%" del "%ListExist%" 
    if exist "%ListExtra%" del "%ListExtra%" 
    goto EndBatch 
) 

%SystemRoot%\System32\findstr.exe /I /L /X /G:"%ListFiles%" "%ListCurrent%" >"%ListExist%" 
%SystemRoot%\System32\findstr.exe /I /L /X /V /G:"%ListExist%" "%ListFiles%" >"%ListMissing%" 
%SystemRoot%\System32\findstr.exe /I /L /X /V /G:"%ListExist%" "%ListCurrent%" >"%ListExtra%" 

:EndBatch 
del "%ListCurrent%" 
endlocal 

Dieser Batch Code erfordert, dass FileList.txt im Verzeichnis der Batch-Datei der Dateinamen mit vollständigem Pfad enthält.

Hinweis:%~dp0 wird auf den Pfad der Stapeldatei erweitert, die bereits mit einem umgekehrten Schrägstrich endet. Geben Sie daher keinen zusätzlichen Backslash vor dem Dateinamen an.

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • copy /?
  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • findstr /? ... wichtigsten zu verstehen, wie das Filtern der Listen arbeiten.
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

Siehe auch den Microsoft Artikel über Using command redirection operators für eine Erklärung der >, >nul und 2>nul.

0
@echo off 
setlocal 

rem Load the list of filenames in *the subscripts* of an array 
FOR /F "usebackq delims=" %%f IN ("filelist.txt") DO set "name["%%f"]=1" 

rem Process files, remove elements of existent files from array 
for %%f in (*.*) do (
    IF defined name["%%f"] (
     ECHO %%f exists >> "%~dp0Exists.txt" 
     set "name["%%f"]=" 
    ) ELSE (
     ECHO %%f is extra >> "%~dp0ExtraFiles.txt" 
    ) 
) 

rem Report remaining elements in the array 
for /F "tokens=2 delims=[]" %%f in ('set name[') do (
    ECHO %%~f doesn't exist >> "%~dp0doesntexist.txt" 
) 
+0

Danke Jungs - das funktioniert fast. Das Problem besteht jetzt darin, dass die Ausgabe von 'Extra-Dateien' nur Dateien in demselben Verzeichnis wie die Batch-Datei anzeigt; Es scheint nicht die Verzeichnisstruktur zu durchsuchen, in der sich meine Dateien befinden, obwohl es die Exists/Exists-Berichte gibt. IN 'Filelist'txt' habe ich den Pfad zu jeder Datei, aber nur von wo es in Bezug auf die Batchdatei ist (dh auf den vollständigen Pfad nur folder1 \ folder2 \ file.txt – SwagBag

+0

Vollständiger Pfad zur Datei Dateiliste.txt aber hinzugefügt Das gleiche Ergebnis ... – SwagBag

+0

Nun, Sie haben uns den Inhalt der Datei 'filelist.txt' nicht gezeigt, also können wir nur raten ...Der 'for'-Befehl verarbeitet nur die Dateien im aktuellen Verzeichnis, also müssen Sie auf diese Weise '/ R' hinzufügen:' for/R %% f in (*. *) Do ('. Beachten Sie, dass die Namen in die Textdatei muss _das gleiche Format_ der Namen haben, die von 'for/R' zurückgegeben werden, führen Sie einfach' for/R' an der Eingabeaufforderung mit einem '@echo% f'-Befehl aus, um dieses Format zu sehen – Aacini