jonny83
Goto Top

Dateiname - bestimmtes Zeichen an unbestimmter Stelle suchen und ersetzen via Batch

Dateinamen sollen nach einem Zeichen durchsucht werden und das dann durch ein bestimmtes ersetzt werden - Variabel sind jeweils die Stellen in dem Dateinamen.

Hallo,

auch nach längerem Suchen, hier im Forum und google, bekomme ich das nicht hin face-sad

Folgendes muss ich machen:

Derartige Dateien

ABC%20DEF%20GHIJKLMN%20.pdf
Das%20ist%20ein%20Test%20.txt
Gib%20mir%20bitte%20Leerstellen.doc

ändern in

ABC_DEF_GHIJKLMN_.pdf
Das_ist_ein_Test_.txt
Gib_mir_bitte_Leerstellen.doc

Die Dateinamen beinhalten also unterschiedlich viele Zeichen vor und nach %20

Was ich jetzt suche ist eine Batch die mir %20 in _ ändert.

Hier im Forum finde ich derartiges nur mit einer gleichen Anzahl von Zeichen vor und nach einer Variablen.

Der String ren *%20*.txt *_*.txt führt mich leider immer zu dem Ergebnis:

ABC%20DEF%20GHIJKLMN%20.pdf_.pdf
Das%20ist%20ein%20Test%20.txt_.txt
Gib%20mir%20bitte%20Leerstellen.doc_.doc

PS: Die Verwendung eines Tools ist ausgeschlossen - renameit oä. fällt somit leider weg. Es muss durch ein Skript gelöst werden.

Danke im Voraus für eure Hilfe!

Content-ID: 130517

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

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

Biber
Biber 30.11.2009 um 09:56:10 Uhr
Goto Top
Moin jonny83,

ich würde mich da nicht mit rumskripten aufhalten für so einen pilpul.
Fackel die Klamotte bei Bedarf mit einer Halbzeile vom CMD-Prompt ab.
(= 9:52:20  D:\temp=)
>for %i in ("e:\schnipsel\*%20*.*") do @set "neu=%~nxi" & echo ren "%i" "!neu:%20=_!"  
ren "e:\schnipsel\ABC%20DEF%20GHIJKLMN%20.pdf" "ABC_DEF_GHIJKLMN_.pdf"  
ren "e:\schnipsel\Das%20ist%20ein%20Test%20.txt" "Das_ist_ein_Test_.txt"  
ren "e:\schnipsel\Gib%20mir%20bitte%20Leerstellen.doc" "Gib_mir_bitte_Leerstellen.doc"  
[ das ">" nicht mit eingeben; ist Teil meines Prompts]
[das "Echo ren" ist in beiden Schnipseln natürlich nur zum Testen... wenn tatsächlich umbenannt werden soll, das Wort "echo" weglassen]
Falls bei dir "Delayedexpansion" nicht standardmäßig gesetzt ist, kommen noch zwei Worte mehr dazu
(= 9:52:21  D:\temp=)
>setlocal enableDelayedExpansion & for %i in ("e:\schnipsel\*%20*.*") do @set "neu=%~nxi" & echo ren "%i" "!neu:%20=_!"  
ren "e:\schnipsel\ABC%20DEF%20GHIJKLMN%20.pdf" "ABC_DEF_GHIJKLMN_.pdf"  
ren "e:\schnipsel\Das%20ist%20ein%20Test%20.txt" "Das_ist_ein_Test_.txt"  
ren "e:\schnipsel\Gib%20mir%20bitte%20Leerstellen.doc" "Gib_mir_bitte_Leerstellen.doc"  
... aber selbst dann geht es schneller, diese eine Zeile einzutippseln als zu überlegen, wie denn wohl der Batch hiess, unter dem diese Umbenamserei abgespeichert ist.

Grüße
Biber
jonny83
jonny83 30.11.2009 um 10:07:19 Uhr
Goto Top
Hallo Biber,

danke für die schnelle Antwort.

Zwei Dinge habe ich noch:

Es geht hier um den gesamten Inhalt eines Ordners c:\schnipsel\*.* <-- Egal was hier drin ist soll nach %20 durchsucht werden und bei "found" mit _ ersetzt werden.

Das zweite ist eine Frage:

kannst du mir nochmal das Skript erstellen (wie oben) mit der Voraussetzung das eben alle Dateien in dem Ordner bearbeitet werden?

danke!!!!
jonny83
jonny83 30.11.2009 um 10:33:56 Uhr
Goto Top
es geht hier auch darum meinen Benutzern ein Vorgehen zu beschreiben:

1. !Kopieren! Sie die betreffenden Dateien im Ordner C:\rename ab
2. Starten Sie das Programm "Start" "Programme" "Rename" Rename
3. Prüfen Sie ob die Dateien wie gewünscht umbenannt wurden

So - unter der Ink Rename muss klar meine Batch folgen face-smile
paulepank
paulepank 30.11.2009 um 12:04:35 Uhr
Goto Top
Hallo,

@Biber

setlocal enableDelayedExpansion
wirkt nur in einer Batch

in einem Einzeiler geht es dann so:
cmd /v:on /c "for %i in ("e:\schnipsel\*%20*.*") do @set "neu=%~nxi" & echo ren "%i" "!neu:%20=_!""  

@jonny83

was dir Biber geschrieben hat, erfüllt den Tatbestand des Durchsuchens nach %20.
Wenn du unbedingt für deine User eine Batch schreiben willst, dann tu Du es, indem du Bibers Einzeiler in eine Batch schreibst und die %-Zeichen verdoppelst.

cu paulepank
jonny83
jonny83 30.11.2009 um 13:44:57 Uhr
Goto Top
@bider

vielen Dank für die Antwort - an der Stelle sei das nochmal gesagt!

@ paulepank

auch hier ein Danke für die Antwort - ich wollte ja nicht das Biber mir die Arbeit komplett abnimmt - nur wusste ich schon vorher das folgende Fragen auftauchen würde:

Folgendes habe ich in einer rename.cmd stehen:

C:\>setlocal enableDelayedExpansion & for %i in ("c:\rename\*%20*.*") do @set "n
eu=%~nxi" & ren "%i" "!neu:%20=_!"

Folgende Ausgabe erhalte ich:

Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.


tut mir leid - aber ich finde den Fehler nicht ....
paulepank
paulepank 30.11.2009 um 14:14:44 Uhr
Goto Top
Hallo,

wenn z.B. im Ordner "rename" eine Datei A%20B.pdf und ein Datei A_B.pdf enthalten ist, kommt beim Umbenennen diese Fehlerauschrift.
Du mußt also diesen Umstand entsprechend beachten.

cu paulepank
Biber
Biber 30.11.2009 um 14:34:45 Uhr
Goto Top
Moin jonny83,

sorry, war anderweitig beschäftigt.

Wenn es denn nun in Gates Namen eine Batchdatei sein muss, dann anbei dafür eine (mögliche) Syntax unter der Auflage:
Versuch bitte nicht, die Logik der einfachen und doppelten Prozentzeichen irgendwem abends beim Darts in der Kneipe zu vermitteln.
::--- Renamer.cmd
@echo off & setlocal enableDelayedExpansion 
for %%i in ("c:\rename\*%%20*.*") do (  
     set "neu=%%~nxi"   
     Echo ren "%%i" "!neu:%%20=_!"  
) 

Die Batch sieht - in diesem exotischen Fall - nicht unbedingt leserlicher aus als der CMD-Oneliner, weil...
  • zwar die eine (logische) Befehlszeile auf 4 optische Zeilen verteilt werden kann
  • und ich auch noch in einfachen Worten plausibel rüberbringen kann, dass im Batch aus %i ein %%i, aus %j ein %%j wird etc.
  • aber damit der Suchstring "%20" nicht mit einem möglichen Parameter %2 verwechselt werden kann, dazu sind nochmals in vollkommen abstrusen Stellen %-Zeichen einzustreuen.
---> nimm die Syntax einfach so hin.

Grüße
Biber

P.S. @paulepank
Yep, der Hinweis auf "Cmd /v:on" ist berechtigt.
Und eigentlich funktioniert (oder funktioniert geplanterweise) SetLocal EnableDelayedExpansion auch nur im Batch.
jonny83
jonny83 30.11.2009 um 14:48:15 Uhr
Goto Top
Hallo Biber,

hey - ich danke dir 1000fach!
Super klasse - so funktioniert es jetzt prima!

Vielen vielen Dank!!!!

Gruß
jonny83