hellfighter
Goto Top

Dateien umbenennen ohne dabei vorhandene Dateien zu überschreiben.

Hi,

Das Szenario:
1. Eine Batchdatei holt von einem FTP-Server Dateien eines bestimmten Types ab (ala *.txt) und speichert diese in ein Ordner "input". Diese Dateien beginnen mit einem Datum (yyyymmdd), gefolgt von weiteren 18 unbestimmten Zeichen und der Dateiendung.
2. Zur Weiterverarbeitung mit einem anderen System benötige ich allerding nur die letzte Datei mit einem festen Dateinamen (z.b. neudatei20050606.txt) im Verzeichnis "output".

Das Problem:
Normalerweise kommt vom FTP am Tag nur eine Datei die umbenannt werden muss. Es kann aber auch sein das es zwei oder mehr sind. In diesem Fall soll nur die letzte und damit neuste den festen Dateinamen erhalten und alle anderen bzw älteren des Tages mit einer Nummerierung versehen werden (zb: neuedatei20050606-1.txt, neuedatei20050606-2.txt). Bereits vorhandene Dateien sollten also nicht überschireben werden sondern umnummeriert werden.
Ein weiteres Problem was ich dabei hab, das auf dem FTP auch mit unter mehrere Dateien der vergangen Tage sein können. Das ganze müsste also abhängig vom Datum der Dateienamen sein (die ersten acht Zeichen).

Meine Frage:
Also ich hab es nun schon mal soweit hinbekommen das er die Dateien abholt und die Dateinamen in eine Datei schreibt (die neuste zuerst). Der Rest bereitet mir allerding Kopfschmerzen zumal als Scriptsprache in meinem Fall nur Batch zum Einsatz kommen darf.
Hat jemand eine Idee wie ich das Problem lösen könnte?

Danke und Gruß
Hellfighter

Content-Key: 11524

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

Printed on: April 18, 2024 at 00:04 o'clock

Member: Biber
Biber Jun 06, 2005 at 11:23:12 (UTC)
Goto Top
Moin Hellfighter,
ein, zwei Rückfragen noch zum Szenario, dann gern die Lösung:

1) Die Batch, die die Dateien vom FTP-Server holt:
?Wird die manuell gestartet oder als Task? Einmal am Tag oder unregelmäßig?

2) Brauchst Du die umbenannten Dateien am gleichen Tag oder erst morgen die von heute?
Sprich: muss berücksichtigt werden, dass eine bereits kopierte und umbenannte Datei nun doch nicht die aktuellste und erhaltenswerteste ist?

3) Willst Du den neuen Batch als Task laufen lassen oder manuell/unregelmäßig oder direkt vor und von der angedeuteten Weiterverarbeitung?

Frank / der Biber aus Bremen
Member: hellfighter
hellfighter Jun 06, 2005 at 13:44:38 (UTC)
Goto Top
Hi,

das ging ja schnell!

1) Also in der Testphase wird das Script manuell ausgeführt und das wohl auch eher unregelmässig. Wenn ich dann den die Zustimmung bekomme, kann alles als Task laufen lassen.

2) Mhh ich glaub ich hab das vorhin nicht ganz so gut Erklärt - Ich versuch es deshalb noch mal.
a) Das Script holt die Datein mit der Endung *.txt hab und löscht sie auf dem Server. Normalerweise sind ist da auch nur eine Dartei da mit dem Erstellungsdatum (im Regelfall das aktuelle Datum).
b) Die aktuellste Datei wir umbenannt in ein festen Dateinamen: Z.B. :neuedatei20050606.txt das enthaltene Datum wird aus dem der Orginaldatei übernommen, da die das Datum bereits beinhalten. (orginal: yyyymmdd18Zeichen.txt)
c) wenn die Datei verarbeitet wurde wird Sie gelöscht.

So nun kann es aber sein das auf dem FTP mal Dateien von zwei Tagen liegen (wenn es an einem Tag mal Probleme gab und dies Nachrereicht wird) oder aber es kommen zwei Dateien für ein Tag (wenn Infos nachreeicht werden müssen)
In diesen Fällen sollen die älteren Dateien beibehalten werden und nummeriert werden.

Hierzu ein Beispiel:

Auf dem FTP liegen vier Dateien die abgeholt wurden und anschliessend sortiert wie folgt in einer Datei festgehlaten werden:
20050606dedgfzeg1.txt
20050606djdvsdpb2.txt
20050605vdfvffvsd1.txt
20050605hnnhkggo2.txt

Das Script macht daraus folgendes:
neuedatei200506.txt
neuedatei200506-1.txt
neuedatei200505.txt
neuedatei200506-1.txt

Soweit kein direktest Problem - glaub ich zumindest face-confused Wenn nun aber für den aktuellen Tag noch eine Datei nachgereicht wird müss das script vor dem Umbenennen Prüfen ob es schon eine gibt:

Die neue Datei vom FTP:
20050606srgiffbfi4.txt

Das Script merkt beim Umbenennen das es schon eine "neuedatei20050606.txt" gibt und nennt diese vorher um. Mit folgendem Ergebniss:

neuedatei200506.txt (die neustet Datei von FTP)
neuedatei200506-1.txt (die vormals neuste Datei)
neuedatei200506-2.txt (die älteste Datei des Tages)

3) Später soll das ganze per Task laufen aber unamhängig von der Weiterverarbeitung.

Ich hoffe das war so besser erklärt :- |

Gruß
Hellfighter
Member: Biber
Biber Jun 07, 2005 at 09:08:15 (UTC)
Goto Top
Okay, Hellfighter,

den Batch würde ich wie folgt skizzieren:
(ein paar Pfade musst Du anpassen. die kenn ich nicht)


::-----Inhalt ftpcopy.bat
@echo off
Set datestring=
set filename=
set inputdir=D:\temp\input\
set targetdir=D:\temp\next\

:: Die Datei "ftpfiles.lst" in der nächsten Zeile soll die Dateinamen der abgeholten FTPFiles 
:: enthalten. Wie immer die heißen mag bei Dir

if not exist %inputdir%ftpfiles.lst goto end
for /F %%i in (%inputdir%ftpfiles.lst) do call :loop %%i
:: und hier sollte auch die Datei "ftpfiles.lst" gelöscht werden oder auf Länge Null gesetzt 
:: PLEASE UNCOMMENT, IF TESTED  del %inputdir%ftpfiles.lst
goto end


:loop
set Filename=%1
Set Datestring=%Filename:~0,8%
if defined DEBUGBATCH echo %datestring%
if exist %targetdir%neuedatei%datestring%.txt (
  
  if exist %targetdir%neuedatei%datestring%-4.txt (echo "Worst-Case war nicht worst genug!") && pause  
  if exist %targetdir%neuedatei%datestring%-4.txt goto end
  if exist %targetdir%neuedatei%datestring%-3.txt rename %targetdir%neuedatei%datestring%-3.txt neuedatei%datestring%-4.txt
  if exist %targetdir%neuedatei%datestring%-2.txt rename %targetdir%neuedatei%datestring%-2.txt neuedatei%datestring%-3.txt
  if exist %targetdir%neuedatei%datestring%-1.txt rename %targetdir%neuedatei%datestring%-1.txt neuedatei%datestring%-2.txt
  rename %targetdir%neuedatei%datestring%.txt neuedatei%datestring%-1.txt
)

  copy %inputdir%%filename% %targetdir%neuedatei%datestring%.txt >nul
  del %inputdir%%filename%
 
:end

::-----ende Inhalt ftpcopy.bat
P.S. Die "if exist..." Zeilen sind tatsächliche je eine Zeile, auch wenn es hier aus dem Bildschirm umgebrochen wird bei "neuedatei..."


Hope it Helps

Frank / der Biber aus Bremen
Member: hellfighter
hellfighter Jun 07, 2005 at 09:54:51 (UTC)
Goto Top
GODLIKE!

Das funktioniert einwandfrei und macht genau das was es soll - MIT BATCH!!!!!

BIG THX an dich Biber.

Ich muss eingestehen das ich überrascht bin was mit Windows noch alles geht. Ich hab immer auf Linux Shellscripting gesetzt und das MS Zeugs ignorriert. Offenbar ein Fehler wie ich jetzt erfahren musste.
Gibt es gute Lektüren zu Batch wo man sich sowas aneigenen kann? Schaden kann es zumindest nicht zwischen den Welten zu wandern ;)

Gruß
Hellfighter
Member: Biber
Biber Jun 07, 2005 at 10:10:41 (UTC)
Goto Top
Gute Lektüren zu Batch? Ich hab leider noch keine gefunden.

Und was z.B mit den neuen "Befehlserweiterungen" von Win2000/XP geht, ist zwar formal korrekt in der M$-Hilfe beschrieben, aber Beispiele fehlen da auch.

Aber wenn man/frau sich damit mal ein Stündchen auseinandersetzt, sind erstaunliche Sachen möglich.. *gg

Da ich öfters mal die Rechner wechsele, habe ich beispielsweise immer eine inzwischen dreiseitige Batchdatei griffbereit, die ich ins Autostart-Verzeichnis kopiere.

Die macht mir jeden Rechner "wiedererkennbar": alle Laufwerke so gemappt, wie ich es blind erwarte, alle Pfade, alle Umgebungsvariablen bis runter zu meinem Lieblings-Dos-Prompt...etc...

Wir können ja mal abwarten, Hellfighter, ob jemand gute Lektüre dazu kennt und postet, wenn nicht, trümmer ich mal ein paar kleine HOW-TOs zusammen und poste die.

Schönen Tach Dir

Frank / der Biber aus Bremen
Member: hellfighter
hellfighter Jun 07, 2005 at 11:55:27 (UTC)
Goto Top
Hi,

ich nochmal. Hab gerade mein bzw. DEIN Script vorgestellt und da das so problemlos funktionierte gleich ein paar Änderungen aufgedrückt bekommen.

Nun soll einfach bei bereits vorhanden Datei die NEUE angehängt werden. Was ansich sogar einfacher ist als die Lösung zu vor.

Der copy-Befehl kann ja auch Dateien aneinander hängen ala "copy datei1 + datei2 datei3" weshalb ich dein Script wie folgt abgeändert hab:

Inhalt ftpcopy.bat

@echo off
Set datestring=
set filename=
set inputdir=D:\temp\input\
set targetdir=D:\temp\next\

:: Die Datei "ftpfiles.lst" in der nächsten Zeile soll die Dateinamen der abgeholten FTPFiles
:: enthalten. Wie immer die heißen mag bei Dir

if not exist %inputdir%ftpfiles.lst goto end
for /F %%i in (%inputdir%ftpfiles.lst) do call :loop %%i
:: und hier sollte auch die Datei "ftpfiles.lst" gelöscht werden oder auf Länge Null gesetzt
:: PLEASE UNCOMMENT, IF TESTED del %inputdir%ftpfiles.lst
goto end


:loop
set Filename=%1
Set Datestring=%Filename:~0,8%
if defined DEBUGBATCH echo %datestring%
if exist %targetdir%neuedatei%datestring%.txt (


copy /A /Y %inputdir%%filename% + %targetdir%neuedatei%datestring%.txt %targetdir%neuedatei%datestring%.txt


::if exist %targetdir%neuedatei%datestring%-4.txt (echo "Worst-Case war nicht worst genug!") && pause
::if exist %targetdir%neuedatei%datestring%-4.txt goto end
::if exist %targetdir%neuedatei%datestring%-3.txt rename %targetdir%neuedatei%datestring%-3.txt neuedatei%datestring%-4.txt
::if exist %targetdir%neuedatei%datestring%-2.txt rename %targetdir%neuedatei%datestring%-2.txt neuedatei%datestring%-3.txt
::if exist %targetdir%neuedatei%datestring%-1.txt rename %targetdir%neuedatei%datestring%-1.txt neuedatei%datestring%-2.txt
::rename %targetdir%neuedatei%datestring%.txt neuedatei%datestring%-1.txt
)


else (
copy %inputdir%%filename% %targetdir%neuedatei%datestring%.txt >nul
)


del %inputdir%%filename%

:end

ende Inhalt ftpcopy.bat


Nur scheint das nicht zu gehen. Es kommt immer 3x "Das System kann das angegebene Laufwerk nicht finden." pro Copy-Befehl und der ELSE-Befehl scheint bei Batch auch nicht zugehen obwohl ich gelesen hab das es den ELSE-Befehl geben soll (undokumentiert).

Das OS ist Windows 2000 PRO SP4 und wird später Windows 2000 AS sein - Im Falle das diese Angaben von Bedeutung sind.


EDIT
Das mit dem ELSE hab ich gelöst - Das muss in der Zeile mit der schliessenden If-Klammer stehen.
/EDIT

EDIT2
Das mit den Tutorials kann ich nur begrüßen. Alles was ich bis jetzt gefunden hab kann man nur als Einsteiger-Tutorials bezeichnen und die helfen mir nicht viel weiter.
/EDIT2

Gruß
Hellfighter
Member: TommyC
TommyC Apr 05, 2006 at 10:16:56 (UTC)
Goto Top
Hi.

Den ersten IF hst Du mit Der Klammer gechlossen, das ELSE steht zwei Zeilen zu tief. ELSE Muss zwischen den Klammern Stehen in einer eigenen Zeile.

IF bla bla (

) ELSE (

)

Rück den ELSE nach oben.
Sollte Abhilfe schaffen.