PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BAT zur Verzeichnisbereinigung


Eminent
2007-10-11, 07:58:27
Guten Morgen alle zusammen,

ich stehe hier vor einem Problem, bei dem ich auch leider nicht wirklich Ahnung habe.

Es soll ein Skript (d. h. in meinem Fall leider eine .bat-Datei) erstellt werden die ein Unterverzeichnis von "verwaisten" Dateien befreit.

Allgemeine Infos:

Es gibt ein Verzeichnis in dem beliebit viele CSV-Dateien liegen können (z. B. import_sa05.csv). In diesem Verzeichnis gibt es ein Unterverzeichnis (MD5), in diesem Unterverzeichnis liegen Dateien zu denen im "Hauptverzeichnis", deren Name sich aus dem Namen der CSV-Datei + .md5 zusammensetzte (z. B. dann import_sa05.csv.md5).

Das Skript soll jetzt im MD5-Verzeichnis schauen ob es dort Dateien gibt, die im "Hauptverzeichnis" kein Gegenstück mehr haben. Ist dies der Fall soll die Datei gelöscht werden.

Leider sind meine Kenntnisse beim Erstellen einer .bat-Datei fast gleich 0 und ich bin froh wenn ich es zusammenbekomme, dass ich die Dateien in einem Verzeichnis lesen kann.

Könnt ihr mir da vielleicht weiterhelfen?

Vielen Dank schon mal für eure Mühen!

Gruß
Eminent

Lokadamus
2007-10-11, 08:30:26
Könnt ihr mir da vielleicht weiterhelfen?mmm...

Hört sich so an, als ob du erstmal die DOS- Befehle lernen sollst. Bist du Azubi?

dir ist ein Befehl, den du wohl benutzen wirst.
Nebenbei noch die Abfrage "IF EXIST Dateiname ..." um zu überprüfen, ob es die Datei gibt.
Ich wünsche viel Spass dabei, da was zusammenzuwürfeln.

Mit ein paar Unix- Tools, die es auch für Windows gibt, wüsste ich schon, wie ich es machen würde.

Eminent
2007-10-11, 09:06:38
Hi,

danke für die Tips, DOS-Befehle sind mir durchaus geläufig (bin allerdings eigentlich Java-Programmierer).

Ich hab das ganze jetzt auch gerade schon so im Ansatz hin bekommen (also es passiert zumindest schonmal das was ich will! :biggrin: Nur halt noch nich ohne ne zusätzliche Eingabe von mir (die müsste noch weg).

Gemacht hab ich das jetzt so:


echo off

REM Moegliches Tempverzeichnis löschen
rmdir temp /s /q

REM Alle CSV-Dateien nach temp kopieren und Endung .md5 anhängen
for %%f in (*.csv) do xcopy %%f temp\%%f.md5

REM prüfen ob md5-Ordner auch vorhanden
if exist md5 goto check else goto :EOF

:check
REM Ins md5-Verzeichnis gehen
cd md5

REM Fuer jede Datei dort schauen ob es im temp-Verzeichnis eine gleichnamige gibt
REM Ist dies nicht der Fall wird die Datei gelöscht
for %%g in (*.md5) do if not exist ..\temp\%%g del %%g


Nur leider kommt beim xcopy-Befehl immer noch die Zwischenabfrage ob es eine Datei oder ein Verzeichnis ist, kriegt man die irgendwie weg?

Sollte es natürlich schönere Möglichkeiten geben bin ich für Vorschläge natürlich gerne offen. Werde auch mal weiter schauen ob ich nicht vielleicht noch was besseres finde.

Gruß
Eminent

Gast
2007-10-11, 10:28:17
xcopy /?

Gast
2007-10-11, 11:22:03
xcopy /?

Das ergibt lediglich einer Liste von (für diesen Fall) recht nutzlosen Parametern.

Einzig /i - Wenn Quelle ein Verzeichnis ist oder Platzhalterzeichen enthält und Ziel nicht existiert, nimmt xcopy an, dass Ziel einen Verzeichnisnamen angibt; xcopy erstellt dann ein neues Verzeichnis und kopiert alle angegebenen Dateien in das neue Verzeichnis. Standardmäßig fragt xcopy ab, ob es sich bei Ziel um eine Datei oder ein Verzeichnis handelt.

Klingt interessant, hilft aber auch nicht weiter, da Quelle kein Platzhalterzeichen enthält sondern eine feste Datei definiert.

Gast
2007-10-11, 11:22:55
Das ergibt lediglich einer Liste von (für diesen Fall) recht nutzlosen Parametern.

Einzig /i - Wenn Quelle ein Verzeichnis ist oder Platzhalterzeichen enthält und Ziel nicht existiert, nimmt xcopy an, dass Ziel einen Verzeichnisnamen angibt; xcopy erstellt dann ein neues Verzeichnis und kopiert alle angegebenen Dateien in das neue Verzeichnis. Standardmäßig fragt xcopy ab, ob es sich bei Ziel um eine Datei oder ein Verzeichnis handelt.

Klingt interessant, hilft aber auch nicht weiter, da Quelle kein Platzhalterzeichen enthält sondern eine feste Datei definiert.

Außerdem ist das Ziel eben kein Verzeichnis, sondern eine Datei.

Eminent
2007-10-11, 14:23:20
So meine (hoffentlich dann auch funktionierende) Lösung



echo off

REM Moegliches Tempverzeichnis löschen
rmdir temp /s /q

REM Tempverzeichnis leer anlegen
mkdir temp

REM Alle CSV-Dateien nach temp kopieren und Endung .md5 anhängen
for %%f in (*.csv) do copy %%f temp\%%f.md5 /a

REM prüfen ob md5-Ordner auch vorhanden
if exist md5 goto check else goto :EOF

:check
REM Ins md5-Verzeichnis gehen
cd md5

REM Fuer jede Datei dort schauen ob es im temp-Verzeichnis eine gleichnamige gibt
REM Ist dies nicht der Fall wird die Datei gelöscht
for %%g in (*.md5) do if not exist ..\temp\%%g del %%g

Lokadamus
2007-10-11, 15:41:29
So meine (hoffentlich dann auch funktionierende) Lösungmmm...

Wenn ich es richtig sehe, hast du nur xcopy gegen copy ausgetauscht :confused:
Ich dachte, du hast xcopy genommen, weil du noch Verzeichnisse mitkopieren must ...

Eminent
2007-10-12, 07:07:02
mmm...

Wenn ich es richtig sehe, hast du nur xcopy gegen copy ausgetauscht :confused:
Ich dachte, du hast xcopy genommen, weil du noch Verzeichnisse mitkopieren must ...

Nein, ein Kollege meinte er nimmt für solche Sachen dann immer xcopy, deshalb dachte ich nehme ich es halt auch. Aber nachdem ich die Abfragen von xcopy nicht weg bekommen hab, hab ich halt noch n bisschen geschaut. Und da copy (meiner Meinung nach dann) für mich ausreicht hab ich das mal ersetzt und siehe da es kommen keine Zwischenabfragen mehr! :-)

Gruß
Eminent

BAGZZlash
2007-10-12, 10:45:14
Ich meine, xcopy sei auch schneller als copy. Sagt mir jedenfalls meine Erinnerung an DOS-Zeiten.
Die Antwort auf solche Nachfragen kann man mitunter auch in den Befehl 'rein"pipen": Etwa


ECHO D|XCOPY [Quelle] [Ziel]


beantwortet die Frage, ob Datei oder Verzeichnis mit einem "D".

Lokadamus
2007-10-12, 10:54:59
Ich meine, xcopy sei auch schneller als copy. Sagt mir jedenfalls meine Erinnerung an DOS-Zeiten.
Die Antwort auf solche Nachfragen kann man mitunter auch in den Befehl 'rein"pipen": Etwa


ECHO D|XCOPY [Quelle] [Ziel]


beantwortet die Frage, ob Datei oder Verzeichnis mit einem "D".mmm...

Was ich nie gemacht habe, war irgendwie sowas:
Befehl < Huhu.txt

Und in der Huhu.txt steht nur der Buchstabe, den man auch drücken würde.