sabine1
Goto Top

Problem mit Batch beim Umbenennen von Leerzeichen

Hallo Alle,

Ich habe ein kleines Problem mit einem Batch Script beim Umbenennen.
Die Beschreibung.
Ich habe eine Batch (Unter Vista) gemacht die bei allen Dateien die
ein Leerzeichen haben das in ein "_" (Underline) umbenennt.

Das Ergbenis ist seltsam.
Es geht sofort wenn ich in einem Directory wie C:\Dateien\ oder D:\Bilder\ bin.
Wenn ich aber im Wurzel Verzeichnis wie C:\ oder D:\ das Batch aufrufe
bekomme ich immer den Fehler "Datei nicht gefunden" und es geht in einen Endlos Loop.

Was mache ich falsch oder was muß ich noch machen damit es überall geht?
Hier ist das Batch

@echo on
:begin_leerzeichen
for /F "tokens=1,*" %%i in ('dir /b "* *"') do ren "%%i %%j" "%%i_%%j"
if exist "* *" goto begin_leerzeichen

Grüße
Sabine

Content-Key: 132717

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

Ausgedruckt am: 30.03.2024 um 01:03 Uhr

Mitglied: bastla
bastla 04.01.2010 um 18:21:02 Uhr
Goto Top
Hallo sabine1 und willkommen im Forum!

Ich würde das eher so versuchen:
@echo on & setlocal
for /F "delims=" %%i in ('dir /b /a-d "* *" 2^>nul') do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "Name=%~nx1"  
ren %1 "%Name: =_%"  
goto :eof
Damit sollte es (durch ein zusätzliches "/s" beim "dir") dann auch möglich sein, gleich alle Dateien in ev Unterordnern mit zu bearbeiten ...

Grüße
bastla
Mitglied: sabine1
sabine1 04.01.2010 um 20:20:10 Uhr
Goto Top
Hi Bastla,

super danke funktioniert einwandfrei.!!
Allerdings ist eine kleine Sachen vom Verständnis noch nicht ganz klar und ich baue auch gerade an einer Erweiterung
wo ich Deinen Rat Bitte auch gerne hätte. Bei Deinem Batch ist mir nur die Zeile set "Name=%~nx1" nicht ganz klar.
Wieso ~nx1 ? Das ren %1 ist dann schon wieder klar.

Ich habe das Batch so erweitert das auch "-" mit "_" und "(" und ")" mit "_" ersetzt werden.
Dabei kann es aber vorkommen das bei einem File z.B.:
name-( Name ).pdf
XXX
durch ersetzen 3x "_" also "___" entstehen.
Die würde ich auch gerne wieder mit nur einem "_" ersetzen.
Ideal wäre eine Sache die alle "_" die hintereinander mehr als 2 mal vorkommen mit nur einem "_" ersetzen.

Ich habe das versucht
:begin_underline_underline
for /F "tokens=1,* delims=_" %%i in ('dir /b /a-d-h "*__*" 2^>nul') do ren "%%i__%%j" "%%i_%%j"
if exist "*__*" goto begin_underline_underline

:begin_underline_underline_underline
for /F "tokens=1,* delims=_" %%i in ('dir /b /a-d-h "*___*" 2^>nul') do ren "%%i___%%j" "%%i_%%j"
if exist "*___*" begin_underline_underline_underline

bekomme aber immer nur "Das System kann die angegebene Datei nicht finden."

Wie muß ich das umbauen das es geht?

Viele Grüße
Sabine
Mitglied: bastla
bastla 04.01.2010 um 20:42:50 Uhr
Goto Top
Hallo sabine1!

Das könnte dann etwa so aussehen:
@echo on & setlocal
for /F "delims=" %%i in ('dir /b /a-d 2^>nul') do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "Name=%~nx1"  
set "Name=%Name: =_%  
set "Name=%Name:(=_%  
set "Name=%Name:)=_%  
set "Name=%Name:-=_%  

:Loop
set "Name=%Name:__=_%"  
echo %Name%|findstr "__">nul && goto :Loop  

ren %1 "%Name%"  
goto :eof
Noch Zum Thema "%~nx1": Damit wird aus dem Parameter 1 nur der Dateiname und die Extension entnommen - solange Du das "dir" ohne "/s" verwendest, wäre diese Schreibweise nicht nötig; wenn allerdings als "%1" ein vollständiger Pfad übergeben wird, muss für das Umbenennen daraus Name + Extension extrahiert werden (also aus zB "D:\Test\Unterordner\name-( Name ).pdf" wird dann nur "name-( Name ).pdf" verwendet). Näheres dazu findest Du ziemlich am Ende der Hilfe zu "for" ...

[Edit] Ev ließe sich das Reduzieren mehrfacher "_" mit der folgenden, vor Zeile 13 einzufügenden, zusätzlichen Zeile noch etwas beschleunigen:
set "Name=%Name:___=_%"
[/Edit]

Grüße
bastla

P.S.: Falls Du die "Code"-Formatierung bereits gesucht haben solltest: siehe ...