2012-04-03 8 views
0

Arbeiten an einer Batch-Datei, aber kein Glück :(Batchdatei zu löschen Dateien aus dem Ordner, deren Dateinamen nicht in der XML erwähnt aus den vergangenen 2 Tage Datei

Ich bin in der Notwendigkeit eines Skripts (Bat), die löscht alle Projekte (meist vb), die nicht in meiner Build-Liste (xml) erwähnt sind

ZB: Ich habe einen Ordner namens C: \ 123, der ungefähr 15 Dateien enthält Ich habe eine Build-Liste (XML-Datei) welche hat 10 Dateinamen, die dort in C: \ 123 sind. Jetzt will ich ein Batchdateiskript, das die restlichen 5 Dateien von C: \ 123 löscht, die in der xml-Datei nicht dort sind.

Irgendein h elp wird sehr geschätzt! Skript versucht, 2 Ordner zu vergleichen und die identischen Dateien löschen ersten (Gedanke daran später zwicken nach meinem Bedürfnis, aber das hat nicht funktioniert)

@ECHO OFF 

SET LOCALFOLDER=C:\123 
SET OTHERFOLDER=D:\123 

Pause 
:LOCALKEYTEMP 

SET FILE=DONE 

:: THIS LINE SCANS THE LOCAL FOLDER FOR FILES, 
:: WE CAN USE THIS TO SCAN SEPERATE FILES ONE AT A 

TIME 

FOR /F "TOKENS=*" %%G IN ('DIR/B ^"%LOCALFOLDER% 

\*.*^"') DO SET FILE=%%G 
Pause 
ECHO %FILE% 
pause 

IF %FILE%==DONE GOTO END 
pause 

ECHO N|COMP "%LOCALFOLDER%\%FILE%" 

"%OTHERFOLDER%\%FILE%" | FIND "FILES COMPARE OK" > 

NUL 
pause 

IF ERRORLEVEL 1 GOTO DIFFERENTKEYS 
IF ERRORLEVEL 0 GOTO DELETEBOTH 
pause 

DELETEBOTH 

DEL /Q "%LOCALFOLDER%\%FILE%" 
DEL /Q "%OTHERFOLDER%\%FILE%" 

GOTO LOCALKEYTEMP 


DIFFERENTKEYS 

:: THIS LINE DELETES THE LOCAL FOLDERS FILES WHICH IS 

NECCESSARY FOR THIS SCRIPT 

DEL /Q "%LOCALFOLDER%\%FILE%" 

GOTO LOCALKEYTEMP 


:END 
ECHO ALL FILES SHOULD BE DELETED FROM 

%LOCALFOLDER% 
pause 
ECHO ALL DIFFERENT FILES SHOULD BE LEFT ON 

%OTHERFOLDER% 
PAUSE 

EXIT 

XML-Datei wie folgt aussieht:

<ProjectsToBuild> 
    <Project>C:\123\Clients\Direct\App1.vbproj</Project>      
    <Project>C:\123\Clients\Direct\App2.vbproj</Project> 
</ProjectsToBuild> 

Ergebnis des Aacini-Stapel-Skripts:

Press any key to continue . . . 
List of existent files: 
fileName[D:\123\Subfolder1\a1.txt.txt]=1 
fileName[D:\123\Subfolder1\a2.txt.txt]=1 
fileName[D:\123\Subfolder1\a3.txt.txt]=1 
fileName[D:\123\Subfolder1\a4.txt.txt]=1 
fileName[D:\123\Subfolder1\buildList.xml]=1 
fileName[D:\123\Subfolder2\a1.txt.txt]=1 
fileName[D:\123\Subfolder2\a2.txt.txt]=1 
fileName[D:\123\Subfolder2\a3.txt.txt]=1 
fileName[D:\123\Subfolder2\a4.txt.txt]=1 
fileName[D:\123\Subfolder2\buildList.xml]=1 
Press any key to continue . . . 

Keep these files: 
Press any key to continue . . . 

Remove these files: 
Press any key to continue . . . 
Press any key to continue . . . 

Das löscht alle Dateien in dem Ordner.

+1

Sie müssen uns zwei Dinge zur Verfügung stellen. 1) Was Sie bisher versucht haben und 2) Wie Ihre Build-Liste aussieht. – adarshr

+0

@adarshhr Danke für Ihre Antwort Adarsh..Ich habe versucht, den Inhalt von zwei Ordnern zu vergleichen und die identischen Dateien zuerst zu löschen. dachte daran, es später nach meinem Bedarf zu optimieren. aber das scheint nicht für mich zu funktionieren –

+0

Können Sie zeigen, wie das XML aussieht? Tut mir leid, ich kann dir nicht helfen, ohne das zu sehen. – adarshr

Antwort

1

Entschuldigung. In Ihrer Frage haben Sie gesagt: "Ich habe einen Ordner mit dem Namen C: \ 123, der ungefähr 15 Dateien darin enthält"; Die Buildliste hat jedoch nur zwei Namen, die sich in Ordnern zwei Ebenen nach unten unter C: \ 123 befinden. In der Tat, C: \ 123 Ordner haben keine einzige Datei in Build-Liste erwähnt. Ich nahm an, dass Sie alle Dateien in C: \ 123 auf jeder Ebene löschen möchten, die in der Build-Liste nicht erwähnt werden (da die Erwähnung der Build-Liste zwei Ebenen unterhalb von C: \ 123 enthält). Wenn dies nicht gewünscht ist, muss die Batch-Datei geändert werden.

@echo off 
setlocal 
rem Create a list of existent file names in C:\123 *at any level* 
for /R "C:\123" %%a in (*.*) do set "fileName[%%a]=1" 
ECHO List of existent files: 
SET fileName[ 
ECHO/ 
rem Process the build list and remove found names from existent files list 
ECHO Keep these files: 
for /F "tokens=2-4 delims=<>" %%a in (buildList.xml) do (
    if "%%a" == "Project" if "%%c" == "/Project" (
     ECHO fileName[%%b] 
     set "fileName[%%b]=" 
    ) 
) 
ECHO/ 
ECHO Remove these files: 
rem Remove the remaining files 
for /F "tokens=2 delims=[]" %%a in ('set fileName[') do (
    ECHO del "%%a" 
) 
+0

Vielen Dank für Ihre Zeit. Entschuldigen Sie. Ja, ich möchte alle Dateien in C: \ 123 \ auf jeder Ebene löschen, die nicht in der Build-Liste enthalten sind !!! Der Baum wird in diesem Fall C: \ 123 und die Unterordner - \ Clients, \ Direct usw. sein. Die Batch-Datei muss in der Lage sein, durch die Unterordner zu gehen, die Dateien zu prüfen und zu löschen, die nicht in der Build-Liste vorhanden sind. Ich habe Ihr Skript oben versucht, aber es scheint nicht für mich zu funktionieren :(plz help. –

+0

@ashishg: Ich habe einige 'ECHO' Befehle hinzugefügt, um zu zeigen, was passiert. Bitte kopieren Sie erneut die Batch-Datei oben, führen Sie sie aus und posten Sie die Ergebnisse – Aacini

+0

Ich habe das Ergebnis des Skripts geschrieben –

Verwandte Themen