jim-knopf
Goto Top

Vergleich Liste von Dateiname mit String - wenn nicht gleich, füge den Inhalt der Datei 1 der Datei 2 zu

Ich bin neu hier und habe heute einige Stunden anhand der diversen Profi-Tipps versucht mein Anliegen zu lösen. Leider ohne Erfolg - daher folgend meine Problemstellung:

Ausgangslage:
In einem Verzeichnis liegen 0, 1 oder 2 Dateien mit der Endung ZIP.
Die Dateinamen haben die Bezeichnung TIF_20090730.ZIP
bzw. die Datei vom Vortag TIF_20090729.ZIP
Es gibt Konstellationen bei der nur die Datei TIF_20090730.zip vorhanden ist oder nur die Datei TIF_20090729.ZIP, beide oder gar keine.

Ziel:
Wenn am Tag Date (20090730) nur TIF_20090730.ZIP vorhanden ist, ist alles OK (Batch beenden)
Wenn am Tag Date (20090730) TIF_20090729.ZIP & TIF_20090730.ZIP vorhanden ist, soll der Inhalt der Datei TIF_20090729.ZIP in die Datei TIF_20090730.ZIP übernommen und die Datei TIF_200907229.ZIP gelöscht werden.
Wenn am Tag Date (20090730) nur TIF_20090729.ZIP vorhanden ist, soll diese auf TIF_20090730.ZIP umbenannt werden.
Wenn keine ZIP-Datei vorhanden ist, ist auch alles OK (Batch beenden)

Wir haben versucht mit dem comand "for" eine Schleife zu schreiben, die alle ZIP-Dateien auf das Datum prüft und dann je nach Resultat die nötigen Schritte ausführt. Bereits der Abgleich hat nicht geklappt.

Für jede Hilfestellung (auch Teilösungen des Problems) bin ich sehr froh!

Gruss
Jim Knopf

Content-Key: 121699

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

Printed on: April 26, 2024 at 08:04 o'clock

Member: bastla
bastla Jul 30, 2009 at 16:55:43 (UTC)
Goto Top
Auch Dir, Jim-Knopf, ein mindestens genauso freundliches Hallo und Willkommen im Forum!

Schematisch könnte das etwa so aussehen:
@echo off & setlocal
pushd "Z:\ZIP-Dateien"  
set "Pre=TIF_"  

set "Heute=%date:~-4%%date:~-7,2%%date:~-10,2%  
set "ZIPHeute=%Pre%%Heute%.zip"  

if not exist "%ZIPHeute%" (  
    for /f "delims=" %%i in ('dir /b /a-d "%Pre%*.zip" 2^>nul') do echo ren "%%i" "%ZIPHeute%"  
    popd
    goto :eof
)

for /f "delims=" %%i in ('dir /b /a-d "%Pre%*.zip" 2^>nul^|findstr /i /v /c:"%ZIPHeute%"') do (  
    echo "%%i" entpacken  
    echo entpackte Dateien zu "%ZIPHeute%" hinzufuegen  
)
popd
Vorausgesetzt wird dabei, dass es tatsächlich nur 0 bis 2 Dateien entsprechend dem vorgegebenen Benennungsschema geben kann, und dass von zweien eine "TIF_Tagesdatum.zip" heißt.

Das Hinzufügen der gestrigen zur heutigen Datei wird nur durch Textausgaben simuliert, da mir der genaue Sinn der Aktion bzw die zur Verfügung stehenden Mittel (ZIP-Programm) nicht bekannt sind ...

Grüße
bastla

[Edit] Noch etwas umformuliert ... [/Edit]
Member: Jim-Knopf
Jim-Knopf Jul 31, 2009 at 06:48:44 (UTC)
Goto Top
Hallo bastla

Super herzlichen Dank!
Ich bin grad' dran das ganze mal zu verstehen... ... wie macht ihr das bloss!!! face-smile
Hab' mich aber mit den ZIP vertan:

Es handelt sich um ganz normale Textfiles (das mit dem Zippen kommt erst später und hab' ich schon umgesetzt). Könnte man den Inhalt mit type in eine Variable oder so übernehmen und dann der anderen Datei zuweisen bzw. eben renamen?

NB: Grund für die ganze Aktion:
Die Tagesverarbeitung ist um 22 Uhr fertig und die Daten werden abgeholt. Theoretisch kann nun einer kommen und nach 22 Uhr nochmals eine Datei erzeugen. Das wird vermutlich in 100 Jahre nie vorkommen aber - wir haben's ja mit der IT zu tun - wird es garantiert geschehen, wenn wir den Fall nicht abfangen. Da wir mit Datumstempel arbeiten würde dann vom gleichen Tag zwei Mal ein File mit gleichem Namen erstellt. Natürlich könnte man nun bei der Erzeugung einen Zeitstempel verwenden. Da aber ein externer Partner nur mit Statischen Filenamen umgehen kann, versuchen wir diese etwas aufwändige Lösung umzusetzen.

Danke und Gruss
Jim
Member: bastla
bastla Jul 31, 2009 at 07:41:38 (UTC)
Goto Top
Hallo Jim-Knopf!

Ein bloßes Anfügen der alten an die neue Datei ließe sich mit einem
type "%%i">>"%ZIPHeute%"  
als Ersatz für die Zeilen 15 und 16 machen.

Grüße
bastla
Member: Jim-Knopf
Jim-Knopf Jul 31, 2009 at 09:05:17 (UTC)
Goto Top
Hallo Bastla

Herzlichen Dank.
Ich hab das Skript kurz auf meine Umgebung angepasst und getestet. Funktioniert alles einwandfrei. Kleiner Schönheitsfehler: der Rename wird auch versucht, wenn keine Dateien vorhanden sind. Stört aber nicht.

Der Batch funktioniert aufgrund der Schlaufe auch, wenn mehrere ältere Dateien rumliegen (sofern die heutige Datei da ist).

@echo off & setlocal
pushd "C:\temp\data\"
set "Pre=xxx_"

set "Heute=%date:~-4%%date:~-7,2%%date:~-10,2%

set "txtHeute=%Pre%%Heute%.txt"

if not exist "%txtHeute%" (
for /f "delims=" %%i in ('dir /b /a-d "%Pre%*.txt" 2^>nul') do ren "%%i" "%txtHeute%"
echo ren "%%i" "%txtHeute%"
popd
goto :eof
)

for /f "delims=" %%i in ('dir /b /a-d "%Pre%*.txt" 2^>nul^|findstr /i /v /c:"%txtHeute%"') do (
type "%%i">>"%txtHeute%"
del "%%i"
)
popd

Macht richtig spass hier. Dir natürlich einen ganz speziellen Dank

Gruss
Jim
Member: bastla
bastla Jul 31, 2009 at 09:14:25 (UTC)
Goto Top
Hallo Jim-Knopf!
Kleiner Schönheitsfehler: der Rename wird auch versucht, wenn keine Dateien vorhanden sind.
Dürfte es eigentlich nicht geben (es wird ja vorher mit "dir" das Vorhandensein einer Datei "xxx_*.txt" geprüft), aber um den Fehler wenigstens zu "verstecken", kannst Du den "ren"-Befehl so schreiben
ren "%%i" "%txtHeute%" 2>nul
- damit wird die Fehlermeldung unterdrückt.

Grüße
bastla
Member: Jim-Knopf
Jim-Knopf Jul 31, 2009 at 10:29:24 (UTC)
Goto Top
Perfekt! Super Lösung.
Danke.
Jim