skatastisch
Goto Top

Batch zum Auslesen von Filenamen zum Vergleich

Hallo zusammen face-smile

bin neu hier angekommen und habe schon viele Dinge hier im Forum nachgeforscht und viele Fragen wurden hier vorab bereits beantwortet. Von daher schon einmal vielen Dank für die tollen Beiträge und Hilfestellungen.

Zu meinem Problem das ich leider nicht wirklich hinbekomme:

Ich habe in einem Ordner c:/xyz eine .txt-Datei liegen. Der Inhalt der Datei sieht z.B. folgendermaßen aus:

datei1.tif
datei2.tif
datei3.tif
...usw.

Jetzt will ich jede Zeile und somit Dateinamen der txt-Datei auslesen und vergleichen ob die entsprechende Datei in Ordner c:/xyz vorhanden ist.
Falls ja, soll diese aus dem Ordner c:/xyz gelöscht werden. Falls nicht, soll sie bestehen bleiben.

Ich habe es mit einer einfachen For-Schleife versucht jedoch tut das nicht wirklich face-sad
Hier mein Ansatz:

for /f %%i in (dateinamen.txt) do (if exist %%i (echo Datei ist da) else (echo Datei nicht da))

Habe das mit dem Löschen noch nicht mit eingebaut, da ich mir nicht wirklich sicher bin wie ich eine Sprungmarke aufrufe und dort den aktuellen Zeilenwert übergebe.
Für eine Lösung wäre ich euch sehr dankbar face-smile Wenn möglich mit einer kurzen Erklärung zu den Statements.

Vielen Dank schon einmal im Voraus.

Gruß

Content-Key: 134641

Url: https://administrator.de/contentid/134641

Ausgedruckt am: 28.03.2024 um 16:03 Uhr

Mitglied: Edi.Pfisterer
Edi.Pfisterer 28.01.2010 um 21:04:46 Uhr
Goto Top
Hallo!
Muss Deine Lösung in DOS geschrieben sein?
Falls nicht:
VBScript ist Dein Freund face-wink

Stichwort
FileSystemObject

Ansatz:
xyz.txt mit FileSystemObject öffnen
Zeilen auslesen
for next schleife

Datei löschen

hoffe, das hilft dir weiter...

gutes gelingen
Mitglied: Skatastisch
Skatastisch 28.01.2010 um 21:08:04 Uhr
Goto Top
Ja muss DOS sein face-smile

Mit anderen Skripten habe ich mehr Spielraum das weiß ich, jedoch hilft es nichts face-smile
Mitglied: Edi.Pfisterer
Edi.Pfisterer 28.01.2010 um 21:14:22 Uhr
Goto Top
also in etwa so (ohne gewähr)
'Variablen & Konstanten erstellen  
Dim fso, fsoFile, Pfad
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Pfad = "C:\Inetpub\wwwroot\Test.txt"  

'Objekte erstellen  
set fso = Server.CreateObject("Scripting.FileSystemObject")  

If fso.FileExists(Pfad) Then
  set fsoFile = fso.OpenTextFile(Pfad, ForReading , true, TristateFalse)
Else
  Response.Write("Kleiner Fehler: Datei ist nicht vorhanden.")  
End if

'Text aus Datei lesen und ausgeben  
Do while not fsoFile.AtEndOfStream
                 dateiname = fsoFile.ReadLine
                 dateiname = "C:\meinpfad\" & dateiname            'Damit du den vollen Pfad erhälst  

                 fso.DeleteFile(DATEINAME)
end if

Loop

'TextDatei schliessen und Objekte terminieren  
fsoFile.close
set fsoFile = nothing
set fso = nothing
Mitglied: Edi.Pfisterer
Edi.Pfisterer 28.01.2010 um 21:15:11 Uhr
Goto Top
Sorry, zu spät gelesen....

DOS ist keine meiner spezialitäten
sorry...

Warum DOS? Hausübung?
Mitglied: Biber
Biber 28.01.2010 um 21:18:43 Uhr
Goto Top
Moin Skatastisch,

willkommen im Forum.

Und -versprochen- wir bringen dich schon auf den richtigen Weg.

Aber wir müssen erstmal das Werkzeug bereitlegen, bzw. die Fundamente legen.

1)
Jetzt will ich jede Zeile und somit Dateinamen der txt-Datei auslesen und vergleichen ob die entsprechende Datei in Ordner c:/xyz vorhanden ist.
Okay..
Falls ja, soll diese aus dem Ordner c:/xyz gelöscht werden.
Okay...
Falls nicht, soll sie bestehen bleiben
Häh? falls nicht vorhanden, lassen wir sie einfach bestehen?

2)
Codeschipsel gehören in Code-Tags, siehe in unseren FAQ.

3)
Ich habe es mit einer einfachen For-Schleife versucht jedoch tut das nicht wirklich
"tut das nicht wirklich" ist keine Fehlerbeschreibung.

4)
Deine Batch-Zeile funktioniert ja durchaus, aber eben nur unter Schönwetterbedingungen...
a) Du musst bei Aufruf des Batch-Schnipsels im Verzeichnis C:\xyz sein, damit die "dateinamen.txt" gefunden wird
b) und damit die dort gelisteten Dateien gefunden werden
c) und es dürfen keine Dateien mit "Leerzeichen im Namen.gif" vorkommen
d) und -obwiohl du den Dateinamen %%i in der Hand hast, erfährst du beim "echo" weder im Erfolgs- noch im Fehlerfall, welche Datei gelöscht/nicht gefunden wurde.

Lass uns da mal Schritt für Schritt durch.

Grüße
Biber
Mitglied: Skatastisch
Skatastisch 28.01.2010 um 22:22:07 Uhr
Goto Top
Hallo Biber,

danke für die Begrüßung und es wäre natürlich schön wenn das Ganze gelöst werden kann face-smile

Also dann versuche ich das Ganze mal etwas genauer zu verdeutlichen:

zu 1:
Ist der Dateiname, welcher auch in der TXT-Datei in einer Zeile auftaucht vorhanden, soll diese gelöscht werden. Ignorier einfach den Teil wozu du so schön "häh" geschrieben hast weil das ist wirklich etwas dubios ausgedrückt face-smile

zu 2:
Ok fürs nächste Mal face-smile
Hier auch gleich der erste Test im Anschluss.

zu 3:
Damit hast du recht. Ich bin mir auch nicht wirklich sicher ob meine Schleife allgemein syntaktisch korrekt ist und unter Windows mit einer Batchdatei korrekt läuft face-sad
Von daher wollte ich nur mal meine Ansätze präsentieren, welche ich mir mit Schnipseln fast schon verzweifelt zusammengewürfelt habe.

zu 4:
Die Schönwetterbedingungen sind alle gegeben.
a: Ich befinde mich tatsächlich in diesem Verzeichnis und in diesem sind sowohl die TXT-Datei mit den Dateinamen
b: als auch die dort gelisteten Dateien
c: und es tauchen definitiv keine Leerzeichen im Namen.
d: das stimmt. eine Meldung hierfür wäre sicher hilfreich, jedoch klappte das bei mir mit %%i Übergabe zum Echo nicht warum auch immer face-sad

Neuer Ansatz:
- Ich befinde mich im Verzeichnis c:/xyz
- In diesem Verzeichnis befinden sich 5 Dateien mit den Dateinamen 1.tif, 2.tif, 3.tif, 4.tif, 5.tif
- In diesem Verzeichnis befindet sich eine TXT-Datei mit folgendem Inhalt:
1.tif
2.tif
3.tif
4.tif
6.tif

Nun bräuchte ich eine Schleife (oder auch gerne was anderes, wenn sich etwas anderes besser eignet) die mir jede Zeile einzeln ausliest,
überprüft ob die Datei vorhanden ist, falls ja diese löscht und dann zur nächsten Zeile übergeht und das gleiche macht.
Mitglied: Biber
Biber 28.01.2010 um 22:55:58 Uhr
Goto Top
Moin Skatatisch,

nun denn, für deine Anforderung brauchst du (wenn das schöne Wetter so bleibt) eigentlich nicht wirklich etwas ändern.
[OT]
Nur sicherheitshalber als Anmerkung, damit es uns nicht später einholt:
Die Schreibweise "..Verzeichnis C:/xyz .." ist Unix-Like. Unter Windows-Betriebssystemen immer den Backslask "C:\xyz " nehmen.
[/OT]

Deine Vorlage war ja
::--EinBatchInXyz.bat
for /f %%i in (dateinamen.txt) do (if exist %%i (echo Datei ist da) else (echo Datei nicht da))

Der macht auch das, was du verlangst.

Aber du kannst ihn ein wenig "lesbarer" formatieren
::--EinBatchInXyz.bat
for /f %%i in (dateinamen.txt) do (
   if exist %%i (
          echo Datei %%i ist da
   ) else (
          echo Datei %%i nicht da
   )
)

Wenn du von diesem Gerüst ausgehst, dann wären die nächsten Verfeinerungsschritte
  • dort, wo jetzt je eine Zeile "echo Irgend ein Anfang.." steht, dort könnten auch ein, zwei oder mehr zeilen rein, die im jeweiligen IF oder ELSE etwas Sinnvolles tun
  • oder aber [alternativ / ebenso gut] könnte dieser logische Teil-"Block" dann ausgelagert werden und mit "call :meinDeleteBlock" oder so aufgerufen werden.

Grüße
Biber
Mitglied: bastla
bastla 29.01.2010 um 00:01:22 Uhr
Goto Top
@urobe73
Da ist Dir ein wenig ASP reingerutscht face-wink:
set fso = Server.CreateObject("Scripting.FileSystemObject")  
Response.Write("Kleiner Fehler: Datei ist nicht vorhanden.")  
In VBS:
set fso = CreateObject("Scripting.FileSystemObject")  
WScript.Echo "Kleiner Fehler: Datei ist nicht vorhanden."  
Grüße
bastla
Mitglied: Biber
Biber 05.02.2010 um 13:25:22 Uhr
Goto Top
Moin Skatastisch,

bist du inzwischen weitergekommen und kommt von dir noch Feedback zu diesem Beitrag?

Grüße
Biber