solaris-ch
Goto Top

Files umbenennen anhand Liste in txt File

Habe leider im Forum nichts passendes gefunden. Es hat zwar viele ähnliche Themen, aber diese weichen doch zusehr von dem von mir gesuchten ab.

Folgendes Problem stellt sich mir:

Ich habe ein Folder in dem hunderte pdf Files liegen.
Die Namen dieser Files habe ich in ein .txt File geladen (RESULT.txt).

Nun wird das File mittels Excel um eine Spalte erweitert, in der der neue Filename steht.
Das Ziel dieses Batches ist es, Dateinamen umzubenennen, aber auf eine etwas, sagen wir einmal speziellere Art und Weise.

Das File sieht nun so aus:

OldFilename1.pdf;NewFilename.pdf
OldFilename2.pdf;NewFilename.pdf
OldFilename3.pdf;NewFilename.pdf
u.s.w.

Wie bekomme ich das hin, dass der Batch nun anhand der Liste das entsprechende (Old...) File sucht und dies mit neuem Namen (New...) in ein Folder namens "Output" ablegt?

Hat mir jemand einen Tip, ein paar Snippets oder vielleicht gar ein fast pfannenfertiges Script? Das wäre echt toll!

Besten Dank und Gruss!

Content-ID: 91961

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

Ausgedruckt am: 15.11.2024 um 23:11 Uhr

Biber
Biber 14.07.2008 um 13:32:29 Uhr
Goto Top
Moin solaris-ch,

nun hab ich mich so gefreut, dass endlich mal eine/r das Wort "umbenennen" richtig schreibt.... und dann buchstabierst Du das Wort davor völlig falsch.

Egal, mein CMD-Line-halbzeile zum "vieles Umbenennen" wäre:
>For /f "delims=; tokens=1,2" %i in (%temp%\tmp2.txt) do @echo move /y "%i" ".\Output\%j"  
move /y "OldFilename1.pdf" ".\Output\NewFilenameA.pdf"  
move /y "OldFilename2.pdf" ".\Output\NewFilenameB.pdf"  
move /y "OldFilename3.pdf" ".\Output\NewFilenameC.pdf"  

...als Beispiel.
* Der Pfad ("\.Output") muss erstens angepasst und zweitens vorher angelegt werden  
* Deine Input-Datei heißt ebenfalls bestimmt anders
* das "@echo" ist nur zum Demonstrieren  
* Als Batch (aber wozu?) müssen alle %-Zeichen verdoppelt werden. Im Gegenzug ist im Batch der Schalter /y gratis mit dabei - braucht nicht eingegeben werden.

Gruß
Biber
solaris-ch
solaris-ch 14.07.2008 um 13:38:56 Uhr
Goto Top
Hi Biber

welches Wort war falsch buchstabiert? face-wink

Danke für deinen Code, aber ich schnall das nicht. Muss vielleicht anfügen das ich überhaupt nicht der Batch-Mensch bin.

Gruss, solaris
Biber
Biber 14.07.2008 um 13:48:12 Uhr
Goto Top
Moin solaris-ch,

aber ich schnall das nicht
Sag ich doch...Du musst noch Files lernen... face-wink

Also... in langsam für Gelegenheitsbätcher.
NUR die Zeile 1 per Copy + paste am CMD-ausprobieren (abfeuern).
Allerdings mit Deiner Umbenams-Datei in der Klammer.
Dort wo jetzt (%temp%\tmp2.txt) steht.

Dann gucken. Und weiter.

Grüße
Biber
solaris-ch
solaris-ch 14.07.2008 um 14:04:07 Uhr
Goto Top
Ok, besten Dank face-wink

es fängt schon gut an...

'/f' is not recognized as an internal or external command,

hab erstmal wie von dir "angeordnet" die erste Zeile per Copy Paste in die Batch gehauen und diese dann ausgeführt...


(Win XP Pro, SP2)

Gruss und besten Dank
Biber
Biber 14.07.2008 um 14:20:46 Uhr
Goto Top
Ähemm... sorry, mein Fehler...
Das ">" (Größerzeichen bitte nicht mit eingeben.
Das soll nur Eingabeprompt darstellen.
und dieser prompt sieht bei Dir evtl so ähnlich aus:
C:\Dokumente und Firlefanz\Solaris-Ch>

Also bitte nur alles ab dem Word "FOR" wie von mir vorgeschlagen...

Grüße
Biber
solaris-ch
solaris-ch 14.07.2008 um 14:28:04 Uhr
Goto Top
Hmmm... langsam zweifel ich an mir selbst...

Ich hab alles wie von Dir gesagt gemacht... Der Command Prompt "blitzt" aber nur kurz auf.
Folgende Variationen habe ich probiert:

FOR /f "delims=; tokens=1,2" %i in (%temp%\RESULT.txt) do @echo move /y "%i" ".\Output\%j"   
pause
Einmal mit, einmal ohne "Pause".

FOR /f "delims=; tokens=1,2" %i in (RESULT.txt) do @echo move /y "%i" ".\Output\%j"   
pause
auch einmal mit und einmal ohne "Pause"...

*Anmirselbstzweifel*

Der Zielordner existiert.
Biber
Biber 14.07.2008 um 19:23:50 Uhr
Goto Top
Moin solarias-ch,

lass uns gaanz ruhig bleiben... *noch einen Gang runterschalt*

Also:
1) einen CMD-Prompt öffnen zum Testen
->Start->Ausführen->cmd eintippen->ENTER
2) die FOR-Zeile von Oben kopieren.

3) Das ist Test. Simulation. Proof-of-concept.... aber kein Batch.
wenn es denn am Prompt sinnvoll funktioniert:

3a) Diese Zeile ohne das "@echo" nachmal abfeuern.... das wird wirklich geMOVED.
3b) eigentlich sollte damit der Drops gelutscht sein - aber wenn Du die Zeile noch als Batch (Textdatei mit der Endung .cmd oder .bat) aufbewahren willst:
::Inhalt von MovePDFsIntoOrdner.cmd
@FOR /f "delims=; tokens=1,2" %%i in (%temp%\RESULT.txt) do @(  
     @echomove  "%%i" ".\Output\%j"   
)
Set /P "dauquery=Soll ich das wirklich tun? J/N"  
IF /i "%dauquery%" NEQ "J" goto :Feichlink  
@FOR /f "delims=; tokens=1,2" %%i in (%temp%\RESULT.txt) do @(  
     move  "%%i" ".\Output\%j"   
)
:Feichlink
pause

Grüße
Biber
solaris-ch
solaris-ch 15.07.2008 um 07:35:13 Uhr
Goto Top
Hi Biber!
Jetzt hats geklappt! Dachte die ganze Zeit ich müsse diese Zeile in der Batch speichern und dann diese ausführen.... face-sad

Das mit der Zeile einfügen und mit/ohne echo hat bestens funktioniert. Nun wollte ich das ganze wie richtig von dir angemerkt als .bat speichern. Ich denke das würde auch funktionieren... Nur... kommt die Fehlermeldung:

The system cannot find the file C:\DOCUME~1\username\LOCALS~1\Temp\RESULT.txt.

ich denke das hat irgendwas mit den Pfaden zu tun, dass er RESULT.txt nicht finden kann. Ich versuchte nun das %temp% durch %CD% zu ersetzen, um den aktuellen Pfad einzubinden, was aber leider nicht klappte. Die Batchdatei sollte mehr oder weniger individuell einsetzbar sein. Damit meine ich, man soll sie per copy/paste irgendwo deponieren können und laufen lassen... und gut ist face-wink.

Was müsste ich noch ändern, damit ich dies erreichen kann?

p.s. wenn du mal kostenlosen Skiurlaub machen willst, mail an mich! face-wink

Gruss aus der Schweiz
Biber
Biber 15.07.2008 um 10:37:31 Uhr
Goto Top
Moin solaris-ch,

wir bekommen das schon zum Fliegen... face-wink

Um die Datei "result.txt" zu finden hast Du mehrere Möglichkeiten:

  • entweder die steht "immer" in einem bestimmten Pfad wie d:\input oder y:\meineSachen --> dann fest eingeben
  • oder die steht "immer" dort, wo auch die batchdatei liegt (meinetwegen auch mit auf dem USB-Stick oder einer CD, wenn die Batch halt dort ist.
Dann kannst Du den Pfad/das verzeichnis des Batches mit %~dp0 ermitteln - das entspricht dem %CD% (welches im Batch so nicht funktioniert).

::... irgendwo in einem unschuldigen Batch...
....
:: wenn die result.txt IMMER dort ist, wo die Batch-Datei liegt:
FOR /f "delims=; tokens=1,2" %%i in (%~dp0\RESULT.txt) do  bla  
....

Über das Ski-urlaubsangebot freue ich mich sehr.
...obwohl Biber auf der Loipe bestimmt schnell auffallen...

Grüße
Biber
solaris-ch
solaris-ch 15.07.2008 um 10:58:13 Uhr
Goto Top
sooooooo, habs gepackt!

Ich hab ein File, welches die Dateinamen ausliest und als .txt speichert (TAB getrennt):
@echo off
set "ordner=%CD%\Input"  
set "datei=%CD%\Index\INDEX.txt"  


set nummer=0
FOR /F "delims=" %%f in ('dir /b "%ordner%\*.*"') do call:schreibe %%f  
sort /R "%datei%.tmp" /O "%datei%"   
del "%datei%.tmp" 2>NUL  
goto:eof

:schreibe
echo %1>>"%datei%.tmp"  
set /a nummer=%nummer%+1

anschliessend muss der Benutzer im Textfile die neuen Filenamen getrennt mit TAB eingeben (Geht am einfachsten via Excel).

Danach führt der Benutzer den zweiten Batch aus:
::Inhalt von rename.bat
@ECHO OFF
CD %CD%"  
@FOR /f "tokens=1,2*" %%i in (Index\INDEX.txt) do @(  
     @echo copy  "Input\%%i" "Output\%%j"   
)
Set /P "dauquery=Soll ich das wirklich tun? J/N "  
IF /i "%dauquery%" NEQ "J" goto :abort  
@FOR /f "tokens=1,2*" %%i in (Index\INDEX.txt) do @(  
     copy  "Input\%%i" "Output\%%j"   
)
:abort
echo done
pause

Ist zwar noch ein wenig ein Hin und Her, aber für meine Zwecke sollte dies längst genügen.

Meinen besten Dank hierbei an Biber, welcher auf humorvolle und hilfreiche Art und Weise geholfen hat!
Betreffend dem Skiweekend möge er mich doch zu gegebener Zeit kontaktieren! face-wink

Gruss
solaris-ch
solaris-ch 16.07.2008 um 09:32:28 Uhr
Goto Top
@Biber: besten Dank fürs neu öffnen!

Ich habe jetzt zwar ein funktionierendes Programm, jedoch nur, solange keine Leerzeichen in den Dateinamen drinn sind... face-wink. Und da die Personen welche das Programm benutzen wollen, auch Filenamen haben welche Leerzeichen beinhalten, müsste da noch eine Lösung gefunden werden.

Ich habe schon probiert Zeile 4 und Zeile 09 mit " Quotes abzuändern:
::Inhalt von rename.bat
@ECHO OFF
CD %CD%"  
@FOR /f "tokens=1,2*" "%%i" in (Index\INDEX.txt) do @(  
     @echo copy  "Input\%%i" "Output\%%j"   
)
Set /P "dauquery=Soll ich das wirklich tun? J/N "  
IF /i "%dauquery%" NEQ "J" goto :abort  
@FOR /f "tokens=1,2*" "%%i" in (Index\INDEX.txt) do @(  
     copy  "Input\%%i" "Output\%%j"   
)
:abort
echo done
pause
Hierbei habe ich %%i in Quotes gesetzt. Dann geht aber der Batch nicht mehr.

Weiss hier jemand Rat?

Besten Dank und Gruss!
Biber
Biber 16.07.2008 um 10:45:27 Uhr
Goto Top
Moin solaris-ch,

bitte spiele folgendes Beispiel am CMD-Prompt nach:
[ mein Prompt ist dargestellt durch ">"]
>type input.txt
OldFilename1.pdf;NewFilename.pdf
"Old Filename2.pdf";"New Filename B.pdf"  
Old Filename 3.pdf; New Filename C.pdf
>@FOR /f "delims=; tokens=1,2*" %i in (INput.txt) do @@echo copy  "Input\%~i" "Output\%~j"  
copy  "Input\OldFilename1.pdf" "Output\NewFilename.pdf"  
copy  "Input\Old Filename2.pdf" "Output\New Filename B.pdf"  
copy  "Input\Old Filename 3.pdf" "Output\ New Filename C.pdf"  

Erläuterung:
  • In der 3-Zeilen-Datei Input.txt sind jetziger/neuer Dateiname durch ";" getrennt.
  • Zeile 1 - "normale" Dateinamen ohne Leerzeichen
  • Zeile 2 und 3 - mit "Leerzeichen im Namen" - mal mit, mal ohne Anführungszeichen.
  • Die angepasste FOR-Anweisung verarbeitet es richtig
  • ABER: Falls in der Datei NACH dem Semikolon und VOR dem NeuenNamen ein/mehrere Leerzeichen sind, kommt (siehe dritte FOR-Ergebniszeile) heraus:
copy "Input\Old Filename 3.pdf" "Output\ New Filename C.pdf"

---> D.H. eigentlich soll der NeueName mit einem Leerzeichen beginnen, wird hier verlangt.

---> Vorsicht: Damit kommen einige M$-Routinen klar und werfen stillschweigend das leading blank weg. Andere Routinen sind ein bisschen blöde suboptimal und versuchen in der Tat, den Dateinamen mit einem Leerzeichen beginnen zu lassen.
Um dort Konflikte zu vermeiden, bitte darauf achten, dass in der Input.txt-Datei keine Leerzeichen NACH Semikolon VOR NeuemNamen stehen.

Im Batch wieder alle %-Zeichen verdoppeln.

Grüße
Biber
solaris-ch
solaris-ch 16.07.2008 um 12:20:05 Uhr
Goto Top
Biiiiber, du bist der Beste!!!
Das klappt wunderbar! Hab noch ein wenig dran rumgeschraubt, alles ein wenig kommentiert...
und es geht!

Beeesten Dank!

Jetzt kannst Du den Thread wieder schliessen. Hoffe es kommen keine weiteren Probleme zu diesem Stück Code hinzu face-wink

Gruss aus der Schweiz