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

Files umbenennen anhand Liste in txt File

Frage Entwicklung Batch & Shell

Mitglied: solaris-ch

solaris-ch (Level 1) - Jetzt verbinden

14.07.2008, aktualisiert 16.07.2008, 9415 Aufrufe, 13 Kommentare

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!
Mitglied: Biber
14.07.2008 um 13:32 Uhr
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:
01.
>For /f "delims=; tokens=1,2" %i in (%temp%\tmp2.txt) do @echo move /y "%i" ".\Output\%j" 
02.
move /y "OldFilename1.pdf" ".\Output\NewFilenameA.pdf" 
03.
move /y "OldFilename2.pdf" ".\Output\NewFilenameB.pdf" 
04.
move /y "OldFilename3.pdf" ".\Output\NewFilenameC.pdf" 
05.
<code> 
06.
...als Beispiel. 
07.
* Der Pfad ("\.Output") muss erstens angepasst und zweitens vorher angelegt werden 
08.
* Deine Input-Datei heißt ebenfalls bestimmt anders 
09.
* das "@echo" ist nur zum Demonstrieren 
10.
* 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. 
11.
 
12.
Gruß 
13.
Biber 
14.
 
Bitte warten ..
Mitglied: solaris-ch
14.07.2008 um 13:38 Uhr
Hi Biber

welches Wort war falsch buchstabiert?

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

Gruss, solaris
Bitte warten ..
Mitglied: Biber
14.07.2008 um 13:48 Uhr
Moin solaris-ch,

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

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
Bitte warten ..
Mitglied: solaris-ch
14.07.2008 um 14:04 Uhr
Ok, besten Dank

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
Bitte warten ..
Mitglied: Biber
14.07.2008 um 14:20 Uhr
Ä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
Bitte warten ..
Mitglied: solaris-ch
14.07.2008 um 14:28 Uhr
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:

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

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

*Anmirselbstzweifel*

Der Zielordner existiert.
Bitte warten ..
Mitglied: Biber
14.07.2008 um 19:23 Uhr
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:
01.
::Inhalt von MovePDFsIntoOrdner.cmd 
02.
@FOR /f "delims=; tokens=1,2" %%i in (%temp%\RESULT.txt) do @( 
03.
     @echomove  "%%i" ".\Output\%j"  
04.
05.
Set /P "dauquery=Soll ich das wirklich tun? J/N" 
06.
IF /i "%dauquery%" NEQ "J" goto :Feichlink 
07.
@FOR /f "delims=; tokens=1,2" %%i in (%temp%\RESULT.txt) do @( 
08.
     move  "%%i" ".\Output\%j"  
09.
10.
:Feichlink 
11.
pause
Grüße
Biber
Bitte warten ..
Mitglied: solaris-ch
15.07.2008 um 07:35 Uhr
Hi Biber!
Jetzt hats geklappt! Dachte die ganze Zeit ich müsse diese Zeile in der Batch speichern und dann diese ausführen....

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:

01.
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 .

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

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

Gruss aus der Schweiz
Bitte warten ..
Mitglied: Biber
15.07.2008 um 10:37 Uhr
Moin solaris-ch,

wir bekommen das schon zum Fliegen...

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).

01.
::... irgendwo in einem unschuldigen Batch... 
02.
.... 
03.
:: wenn die result.txt IMMER dort ist, wo die Batch-Datei liegt: 
04.
FOR /f "delims=; tokens=1,2" %%i in (%~dp0\RESULT.txt) do  bla 
05.
....
Über das Ski-urlaubsangebot freue ich mich sehr.
...obwohl Biber auf der Loipe bestimmt schnell auffallen...

Grüße
Biber
Bitte warten ..
Mitglied: solaris-ch
15.07.2008 um 10:58 Uhr
sooooooo, habs gepackt!

Ich hab ein File, welches die Dateinamen ausliest und als .txt speichert (TAB getrennt):
01.
@echo off 
02.
set "ordner=%CD%\Input" 
03.
set "datei=%CD%\Index\INDEX.txt" 
04.
 
05.
 
06.
set nummer=0 
07.
FOR /F "delims=" %%f in ('dir /b "%ordner%\*.*"') do call:schreibe %%f 
08.
sort /R "%datei%.tmp" /O "%datei%"  
09.
del "%datei%.tmp" 2>NUL 
10.
goto:eof 
11.
 
12.
:schreibe 
13.
echo %1>>"%datei%.tmp" 
14.
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:
01.
::Inhalt von rename.bat 
02.
@ECHO OFF 
03.
CD %CD%" 
04.
@FOR /f "tokens=1,2*" %%i in (Index\INDEX.txt) do @( 
05.
     @echo copy  "Input\%%i" "Output\%%j"  
06.
07.
Set /P "dauquery=Soll ich das wirklich tun? J/N " 
08.
IF /i "%dauquery%" NEQ "J" goto :abort 
09.
@FOR /f "tokens=1,2*" %%i in (Index\INDEX.txt) do @( 
10.
     copy  "Input\%%i" "Output\%%j"  
11.
12.
:abort 
13.
echo done 
14.
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!

Gruss
Bitte warten ..
Mitglied: solaris-ch
16.07.2008 um 09:32 Uhr
@Biber: besten Dank fürs neu öffnen!

Ich habe jetzt zwar ein funktionierendes Programm, jedoch nur, solange keine Leerzeichen in den Dateinamen drinn sind... . 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:
01.
::Inhalt von rename.bat 
02.
@ECHO OFF 
03.
CD %CD%" 
04.
@FOR /f "tokens=1,2*" "%%i" in (Index\INDEX.txt) do @( 
05.
     @echo copy  "Input\%%i" "Output\%%j"  
06.
07.
Set /P "dauquery=Soll ich das wirklich tun? J/N " 
08.
IF /i "%dauquery%" NEQ "J" goto :abort 
09.
@FOR /f "tokens=1,2*" "%%i" in (Index\INDEX.txt) do @( 
10.
     copy  "Input\%%i" "Output\%%j"  
11.
12.
:abort 
13.
echo done 
14.
pause
Hierbei habe ich %%i in Quotes gesetzt. Dann geht aber der Batch nicht mehr.

Weiss hier jemand Rat?

Besten Dank und Gruss!
Bitte warten ..
Mitglied: Biber
16.07.2008 um 10:45 Uhr
Moin solaris-ch,

bitte spiele folgendes Beispiel am CMD-Prompt nach:
[ mein Prompt ist dargestellt durch ">"]
01.
>type input.txt 
02.
OldFilename1.pdf;NewFilename.pdf 
03.
"Old Filename2.pdf";"New Filename B.pdf" 
04.
Old Filename 3.pdf; New Filename C.pdf 
05.
>@FOR /f "delims=; tokens=1,2*" %i in (INput.txt) do @@echo copy  "Input\%~i" "Output\%~j" 
06.
copy  "Input\OldFilename1.pdf" "Output\NewFilename.pdf" 
07.
copy  "Input\Old Filename2.pdf" "Output\New Filename B.pdf" 
08.
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
Bitte warten ..
Mitglied: solaris-ch
16.07.2008 um 12:20 Uhr
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

Gruss aus der Schweiz
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

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

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

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

Frage von liquidbase zum Thema Windows Update ...