Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Batch zum Auslesen von Filenamen zum Vergleich

Frage Entwicklung Batch & Shell

Mitglied: Skatastisch

Skatastisch (Level 1) - Jetzt verbinden

28.01.2010 um 20:39 Uhr, 4165 Aufrufe, 9 Kommentare

Hallo zusammen

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
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 Wenn möglich mit einer kurzen Erklärung zu den Statements.

Vielen Dank schon einmal im Voraus.

Gruß
Mitglied: Edi.Pfisterer
28.01.2010 um 21:04 Uhr
Hallo!
Muss Deine Lösung in DOS geschrieben sein?
Falls nicht:
VBScript ist Dein Freund

Stichwort
FileSystemObject

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

Datei löschen

hoffe, das hilft dir weiter...

gutes gelingen
Bitte warten ..
Mitglied: Skatastisch
28.01.2010 um 21:08 Uhr
Ja muss DOS sein

Mit anderen Skripten habe ich mehr Spielraum das weiß ich, jedoch hilft es nichts
Bitte warten ..
Mitglied: Edi.Pfisterer
28.01.2010 um 21:14 Uhr
also in etwa so (ohne gewähr)
01.
 
02.
'Variablen & Konstanten erstellen 
03.
Dim fso, fsoFile, Pfad 
04.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
05.
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 
06.
Pfad = "C:\Inetpub\wwwroot\Test.txt" 
07.
 
08.
'Objekte erstellen 
09.
set fso = Server.CreateObject("Scripting.FileSystemObject") 
10.
 
11.
If fso.FileExists(Pfad) Then 
12.
  set fsoFile = fso.OpenTextFile(Pfad, ForReading , true, TristateFalse) 
13.
Else 
14.
  Response.Write("Kleiner Fehler: Datei ist nicht vorhanden.") 
15.
End if 
16.
 
17.
'Text aus Datei lesen und ausgeben 
18.
Do while not fsoFile.AtEndOfStream 
19.
                 dateiname = fsoFile.ReadLine 
20.
                 dateiname = "C:\meinpfad\" & dateiname            'Damit du den vollen Pfad erhälst 
21.
 
22.
                 fso.DeleteFile(DATEINAME) 
23.
end if 
24.
 
25.
Loop 
26.
 
27.
'TextDatei schliessen und Objekte terminieren 
28.
fsoFile.close 
29.
set fsoFile = nothing 
30.
set fso = nothing
Bitte warten ..
Mitglied: Edi.Pfisterer
28.01.2010 um 21:15 Uhr
Sorry, zu spät gelesen....

DOS ist keine meiner spezialitäten
sorry...

Warum DOS? Hausübung?
Bitte warten ..
Mitglied: Biber
28.01.2010 um 21:18 Uhr
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
Bitte warten ..
Mitglied: Skatastisch
28.01.2010 um 22:22 Uhr
Hallo Biber,

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

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

zu 2:
Ok fürs nächste Mal
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
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

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.
Bitte warten ..
Mitglied: Biber
28.01.2010 um 22:55 Uhr
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
01.
::--EinBatchInXyz.bat 
02.
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
01.
::--EinBatchInXyz.bat 
02.
for /f %%i in (dateinamen.txt) do ( 
03.
   if exist %%i ( 
04.
          echo Datei %%i ist da 
05.
   ) else ( 
06.
          echo Datei %%i nicht da 
07.
08.
)
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
Bitte warten ..
Mitglied: bastla
29.01.2010 um 00:01 Uhr
@urobe73
Da ist Dir ein wenig ASP reingerutscht :
01.
set fso = Server.CreateObject("Scripting.FileSystemObject") 
02.
Response.Write("Kleiner Fehler: Datei ist nicht vorhanden.")
In VBS:
01.
set fso = CreateObject("Scripting.FileSystemObject") 
02.
WScript.Echo "Kleiner Fehler: Datei ist nicht vorhanden."
Grüße
bastla
Bitte warten ..
Mitglied: Biber
05.02.2010 um 13:25 Uhr
Moin Skatastisch,

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

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Systemdateien
gelöst Registry-Schlüssel per Batch auslesen und in Datei schreiben (9)

Frage von Philzip zum Thema Windows Systemdateien ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Batch & Shell
Per Batch aktuell angemeldete User auslesen (1)

Frage von Peter32 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...