meandmyself
Goto Top

Batch zum Umbenennen v. Dateinnamen (mit festem Such-String) und bereits existierenden Dateinamen

Liebes Forum,

ich weiß, es gibt hier schon viele Beiträge zum Thema Umbenennen von Dateinamen via Batch. Aber die gefundenen Beispiele konnte ich noch nicht richtig anpassen:

In einem feststehenden Verzeichnis befinden sich (DBase)-Dateien nach folgendem Muster:

P0_NEU.DBF ... P6_NEU.DBF und G0_NEU.DBF ... G6_NEU.DBF, diese sollen in P0.DBF bis P6.DBF bzw. G0.DBF bis G6.DBF umbenannt werden. Die Dateien P0.DBF / G0.DBF usw. sind allerdings immer schon vorhanden. Erschwerend kommt hinzu, dass diese von einer Lotus Approach-Datenbank bereits geöffnet sein können. Dies ist an der Endung .adx für die Indexdatei zu erkennen. Die entsprechend geöffneten DBF-Dateien sollen also von der Umbenennung ausgenommen werden.

Was in die richtige Richtung geht ist ein Beitrag von "bastla", denn dieser bespricht das Umbenennen mit gleichzeitigem Überschreiben:

@echo off & setlocal enabledelayedexpansion

for /f "delims=" %%i in ('dir /s /b /a-d "D:\Startpfad\(123)*.xls"') do (
set "Datei=%%~nxi"
echo move "%%i" "%%~dpi!Datei:~5!"
)

Leider reichen meine Batchprogrammierkenntnisse für die gestellte Aufgabe nicht aus, für Hilfe bin ich dankbar.

Gruß,
meandmyself

Content-ID: 120214

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

Ausgedruckt am: 25.11.2024 um 20:11 Uhr

80220
80220 10.07.2009 um 17:09:35 Uhr
Goto Top
bastla ist schon gut. Vor Allem verwendet er grundsätzlich für jeden noch so kleinen Code-Schnipsel die Formatierungshilfe. face-plain
Biber
Biber 10.07.2009 um 17:38:24 Uhr
Goto Top
Moin duunddyself,

ich verstehe an Deiner (technisch durchaus lösbaren) Anforderung zwei Details nicht.

1)
Du schreibst: "..die eine oder andere DBF-Datei könnte schon ...von Lotus Approach geöffnet sein"?
Versteh ich nicht. In ein und demselben Verzeichnis sind diese *.DBF-Dateien, die mal von dBASE, mal von Lotus und mal unter dem Namen P0.dbf, mal unter dem Namen P0_neu.dbf erwartet werden (oder gar irgendwo unter diesem Namen in eirgendwelchem Appz-Sourcecode angesprochen werden) ... und auf diesem offenen Herzen willst Du einen Batch rumrödeln lassen?

2) wenn es doch nur diese paar Drömel-Dateien P0.dbf...P6.dbf bzw. G0dbf...G6.dbf sind, die eigentlich auch nicht alle umbenamst werden müssen... warum machst Du das nicht manuell? Dann wärst Du doch schon seit 15:19h fertig.
Oder hast Du diese merkwürdige Lösung bei 500 Kunden draußen, die Du alle nur per Update-Diskette erreichst?

Grüße
Biber
meandmyself
meandmyself 10.07.2009 um 17:55:39 Uhr
Goto Top
Hallo Biber,

zu 1) in diesen Ordner werden regelmäßig (deswegen Batch) Exportdateien aus einer Access-Datenbank im DBase-Format für eine Lotus Datenbank abgespeichert (P0...P6_NEU.DBF/G0...G6_NEU.DBF). Da die auf die P?.DBF / G?.DBF zugreifende Lotus Datenbank nicht vorhersehbar diese geöffnet hat ist dann das Umbenennen natürlich nicht möglich und auch nicht erwünscht.

zu 2) klar, machen wir ja auch von Hand. Aber geschmeidiger wäre es schon per Batch, da es eigentlich täglich gemacht werden muss.

Danke und Gruß

meandmyself
Biber
Biber 10.07.2009 um 18:14:03 Uhr
Goto Top
Moin DuIch&Ich,

in diesem Fall wäre folgender Oneliner vom CMD-Prompt (im verzeichnis der DBF-Dateien gestartet) der proof-of-concept
[ das ">" stellt meinen Prompt dar; nicht mit eingeben]
for %i in (??_neu.dbf) do @echo if exist p%i.dbf if not exist p%i.adx move /y p%i_neu.dbf p%i.dbf

Diese Zeile sollte alle ??_neu.DBF-Dateien "umbenennen" bzw die vorhandenen ?[0-6].dbf-Dateien ersetzen.
Sofern keine ?[0-6].adx-Datei dagegenspricht.

Falls das das gewünschte Ergebnis ECHOed, dann in einen Batch schreiben;
@echo off & PUSHD "X:\DbfVerzeichnis]  
for %%i in (??_neu.dbf) do if exist p%%i.dbf if not exist p%%i.adx move p%%i_neu.dbf p%%i.dbf
POPD

Der MOVE-Schalter /Y ist im Batch automatisch gesetzt und braucht nicht angegeben werden.

Grüße
Biber
meandmyself
meandmyself 10.07.2009 um 18:30:37 Uhr
Goto Top
Hi Biber,

hab´s am Prompt ausprobiert, haut noch nicht so ganz hin, er wirft mir dann aus:

if exist pP0_NEU.dbf.dbf if not exist pP0_NEU.dbf.adx move /y pP0_NEU.dbf_neu.db
f pP0_NEU.dbf.dbf

thanx
Biber
Biber 10.07.2009 um 18:47:29 Uhr
Goto Top
Upps, sorry...

Da hatte ich zwei Varianten durcheinandergeworfen... eine mit "FOR ..IN (dateimaske)" und eine "FOR /L in (loop)"

Nochmal die proof-of-concept-Zeile einer ungemischten Variante [mit den Ergebniszeilen darunter]:
>for /l %i in (0,1,6) do @echo if exist p%i.dbf if not exist p%i.adx if exist p%i_neu.dbf move /y p%i_neu.dbf p%i.dbf
if exist p0.dbf if not exist p0.adx if exist p0_neu.dbf move /y p0_neu.dbf p0.dbf
if exist p1.dbf if not exist p1.adx if exist p1_neu.dbf move /y p1_neu.dbf p1.dbf
if exist p2.dbf if not exist p2.adx if exist p2_neu.dbf move /y p2_neu.dbf p2.dbf
if exist p3.dbf if not exist p3.adx if exist p3_neu.dbf move /y p3_neu.dbf p3.dbf
if exist p4.dbf if not exist p4.adx if exist p4_neu.dbf move /y p4_neu.dbf p4.dbf
if exist p5.dbf if not exist p5.adx if exist p5_neu.dbf move /y p5_neu.dbf p5.dbf
if exist p6.dbf if not exist p6.adx if exist p6_neu.dbf move /y p6_neu.dbf p6.dbf
Das wäre die Zeile für die P[0-6].DBFs... ich denke, das Muster ist übertragbar auf die G[0-6].dbfs

Also würde ich zu einem einem Batch mit zwei FOR-Anweisungs-Zeilen raten.
Geht natürlich auch mit einer weiteren FOR-Anweisung für den Präfix "P" und "G", aber wird dadurch nicht lesbarer.

Alternativ ginge auch noch:
>for %i in (p0,p1,p2,..., g5,g6) do @echo if exist %i.dbf if not exist %i.adx if exist %i_neu.dbf move /y %i_neu.dbf %i.dbf
if exist p0.dbf if not exist p0.adx if exist p0_neu.dbf move /y p0_neu.dbf p0.dbf
if exist p1.dbf if not exist p1.adx if exist p1_neu.dbf move /y p1_neu.dbf p1.dbf
if exist p2.dbf if not exist p2.adx if exist p2_neu.dbf move /y p2_neu.dbf p2.dbf
if exist ....dbf if not exist ....adx if exist ..._neu.dbf move /y ..._neu.dbf ....dbf
if exist g5.dbf if not exist g5.adx if exist g5_neu.dbf move /y g5_neu.dbf g5.dbf
if exist g6.dbf if not exist g6.adx if exist g6_neu.dbf move /y g6_neu.dbf g6.dbf

Grüße
Biber
meandmyself
meandmyself 10.07.2009 um 19:02:20 Uhr
Goto Top
Großartig Biber,

das funktioniert offenbar! Kleine Nachfrage: ich hab´jetzt in einer Batch:

@echo off & PUSHD "C:\temp]
for %%i in (p0,p1,p2,p3,p4,p5,p6,g1,g2,g3,g4,g5,g6) do if exist %%i.dbf if not exist %%i.adx if exist %%i_neu.dbf move /y %%i_neu.dbf %%i.dbf
POPD

Ich erhalte dann "Das System kann den angegebene Pfad nicht finden." Stimmt was mit der Syntax in der ersten Zeile noch nicht?

Vielen Dank und feine Grüße

immer noch ichundmichselbst
Biber
Biber 10.07.2009 um 19:50:25 Uhr
Goto Top
Menno, Dich&Dich,

jetzt reichts mir aber für diese Woche auch mit meinen blöden Tippfehlern...*grmpff*

Bei dem Befehl PUSHD sollte natürlich Dein Lw:\Verzeichnis ohne (oder wenn erforderlich mit) Anführungszeichen stehen.

Also statt PushD "C:\temp] richtiger
PushD c:\temp
-oder-
PushD "c.\Eigene Dateien und Krempel\usAndweBoth"

Anführungszeichen müssen sein bei "Leerzeichen im Pfad" , dürfen aber auch sonst immer genommen werden.

Grüße an Euch beide und schönes Wochenende
Biber
meandmyself
meandmyself 10.07.2009 um 19:57:10 Uhr
Goto Top
Mille grazie, Biber, perfetto!

Dir auch ein leckeres WoEnde von uns

mm (=meandmyself)