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
GELÖST

Dateien umbenennen ohne dabei vorhandene Dateien zu überschreiben.

Frage Entwicklung Batch & Shell

Mitglied: hellfighter

hellfighter (Level 1) - Jetzt verbinden

06.06.2005, aktualisiert 05.04.2006, 12517 Aufrufe, 7 Kommentare

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
Mitglied: Biber
06.06.2005 um 13:23 Uhr
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
Bitte warten ..
Mitglied: hellfighter
06.06.2005 um 15:44 Uhr
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 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
Bitte warten ..
Mitglied: Biber
07.06.2005 um 11:08 Uhr
Okay, Hellfighter,

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


01.
::-----Inhalt ftpcopy.bat 
02.
@echo off 
03.
Set datestring= 
04.
set filename= 
05.
set inputdir=D:\temp\input\ 
06.
set targetdir=D:\temp\next\ 
07.
 
08.
:: Die Datei "ftpfiles.lst" in der nächsten Zeile soll die Dateinamen der abgeholten FTPFiles 
09.
:: enthalten. Wie immer die heißen mag bei Dir 
10.
 
11.
if not exist %inputdir%ftpfiles.lst goto end 
12.
for /F %%i in (%inputdir%ftpfiles.lst) do call :loop %%i 
13.
:: und hier sollte auch die Datei "ftpfiles.lst" gelöscht werden oder auf Länge Null gesetzt 
14.
:: PLEASE UNCOMMENT, IF TESTED  del %inputdir%ftpfiles.lst 
15.
goto end 
16.
 
17.
 
18.
:loop 
19.
set Filename=%1 
20.
Set Datestring=%Filename:~0,8% 
21.
if defined DEBUGBATCH echo %datestring% 
22.
if exist %targetdir%neuedatei%datestring%.txt ( 
23.
   
24.
  if exist %targetdir%neuedatei%datestring%-4.txt (echo "Worst-Case war nicht worst genug!") && pause 
25.
  if exist %targetdir%neuedatei%datestring%-4.txt goto end 
26.
  if exist %targetdir%neuedatei%datestring%-3.txt rename %targetdir%neuedatei%datestring%-3.txt neuedatei%datestring%-4.txt 
27.
  if exist %targetdir%neuedatei%datestring%-2.txt rename %targetdir%neuedatei%datestring%-2.txt neuedatei%datestring%-3.txt 
28.
  if exist %targetdir%neuedatei%datestring%-1.txt rename %targetdir%neuedatei%datestring%-1.txt neuedatei%datestring%-2.txt 
29.
  rename %targetdir%neuedatei%datestring%.txt neuedatei%datestring%-1.txt 
30.
31.
 
32.
  copy %inputdir%%filename% %targetdir%neuedatei%datestring%.txt >nul 
33.
  del %inputdir%%filename% 
34.
  
35.
:end 
36.
 
37.
::-----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
Bitte warten ..
Mitglied: hellfighter
07.06.2005 um 11:54 Uhr
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
Bitte warten ..
Mitglied: Biber
07.06.2005 um 12:10 Uhr
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
Bitte warten ..
Mitglied: hellfighter
07.06.2005 um 13:55 Uhr
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
Bitte warten ..
Mitglied: TommyC
05.04.2006 um 12:16 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft Office
gelöst Per VBA im Verzeichniss dateien mit Wildcard umbenennen (4)

Frage von usenussi zum Thema Microsoft Office ...

Windows 7
gelöst Mehrere Dateien in Windows umbenennen mit Batchjob (4)

Frage von Jeduja zum Thema Windows 7 ...

Batch & Shell
gelöst Verschieben und Umbenennen von Video-Dateien anhand der Nummer im Namen (3)

Frage von Foja.Filmer zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateien eines Ordners mit find welche 1234 im Namen haben umbenennen in x12345 (4)

Frage von reissaus73 zum Thema Batch & Shell ...

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

Frage von Xaero1982 zum Thema Microsoft ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
RODC über VPN - Verbindung weg (10)

Frage von stefan2k1 zum Thema Windows Server ...