kleinerbub
Goto Top

Batch mehrere Zeichen aus Dateinamen entfernen

Ausgangspunkt: In einem Ordner landen Rechnungen mit beliebigen Dateinamen. Die Namen enthalten zum Teil Zeichen, die von der Software akzeptiert werden und dazu führen, dass die Datei nicht verarbeitet wird.

Ziel: Per Batch-Script aus allen PDF-Dateien die "verbotenen Zeichen" entfernen (welche da wären: .#+), ohne den Punkt vor der Dateiendung zu löschen und die Dateien ins Zielverzeichnis \\server\rechnungen zu verschieben.
Dabei soll es auch möglich sein die Liste der verbotenen Zeichen ggf. zu erweitern.

Prinzipiell ist es egal wie die Dateien heißen. Ich möchte aber nicht einfach alle in 1.pdf, 2.pdf usw. umbenennen, um leichter einen Bezug zum Originaldateinamen herstellen zu können.

Ich habe bereits per Variablenmanipulation einzelne Zeichen ersetzen können, jedoch nicht mehrere auf einmal.

An sich kann es wahrscheinlich nicht so schwer sein, ich bin auf noch nicht auf einen grünen Zweig gekommen.

Gruß kleinerbub

Content-ID: 2730351676

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

Ausgedruckt am: 24.11.2024 um 17:11 Uhr

141986
141986 09.05.2022 um 14:18:24 Uhr
Goto Top
auch keine Begrüßung,

was hast Du denn schon erarbeitet?

Code wäre nett face-smile

VG
TK1987
Lösung TK1987 09.05.2022, aktualisiert am 12.05.2022 um 12:02:06 Uhr
Goto Top
Moin,

Zitat von @kleinerbub:
Ich habe bereits per Variablenmanipulation einzelne Zeichen ersetzen können, jedoch nicht mehrere auf einmal.
An sich kann es wahrscheinlich nicht so schwer sein, ich bin auf noch nicht auf einen grünen Zweig gekommen.
mit Batch ist das der reinste Graus. Man müsste für jedes Zeichen einen separaten Replace machen - und auch das funktioniert bei der Verwendung bestimmter Zeichen nicht vernünftig.

Powershell:
# Quellpfad
$Source = "C:\Pfad\zum\Quellordner"  

# Zielpfad
$Target = "\\server\rechnungen"  

# Zu entfernende Zeichen
$illegalChars = ".#+"  

# Regex-Replace-String aus zu entfernenden Zeichen bilden
$replace = $illegalChars.ToCharArray().Foreach({[regex]::Escape($_)}) -join '|'  

# Für jede Datei im Quellpfad...
Foreach ($File in Get-ChildItem -File -Path $Source) {

  # Datei an Zielpfad verschieben und umbenennen
  Move-Item -Path $File -Destination "$Target\$($File.BaseName -replace $replace)$($File.Extension)"  
  
} # Ende der Foreach-Schleife

Powershell Leitfaden für Anfänger
Regex Tutorial

Gruß Thomas
DOCTEC
DOCTEC 10.05.2022 um 11:06:17 Uhr
Goto Top
Zu einer Batch-Lösung kann ich leider nichts beitragen. Aber wenn es darum geht in einem Verzeichnis ganz viele Dateinamen auf einen Rutsch zu ändern, dann kann ich Dir nur den Total Commander empfehlen. Damit geht das ganz einfach. Im Total Commander einfach in das entsprechende Verzeichnis gehen, dort alle Dateien markieren, die irgendwie geändert werden sollen, STRG+M drücken, im Bereich Suchen & Ersetzen z.B. das #eingeben und durch Nichts oder beliebiges anderes Zeichen ersetzen. Auf Start klicken und abwarten. Das war es. Man kann dort auch die Dateiendung ändern, Datum anhängen, Aufzählungen dranhängen oder beliebige andere Zeichenkombinationen ergänzen oder austauschen. Groß- und Kleinschreibung kann man auch anpassen. Also da geht wirklich viel. Und das eben bei hunderten Dateien gleichzeitig.

Total Commander

Matthias
TK1987
TK1987 10.05.2022 um 12:39:54 Uhr
Goto Top
Moin Matthias,

Zitat von @DOCTEC:
Aber wenn es darum geht in einem Verzeichnis ganz viele Dateinamen auf einen Rutsch zu ändern, dann kann ich Dir nur den Total Commander empfehlen.
in dem Fall kann ich dir nur nahelegen, dir mal den FreeCommander anzugucken.
IMHO ist dieser dem TotalCommander in nahezu jeder Hinsicht überlegen; und ist zudem kostenlos.

Gruß Thomas
DOCTEC
DOCTEC 10.05.2022 um 13:57:07 Uhr
Goto Top
Aber der FreeCommander hat ja ein ganz furchtbares, modernes Design 🤪 !!! Wo bleibt denn da diese wunderschöne nostalgische Windows 95 Optik vom Total Commander? 🤣 Ich verwende den Total Commander schon seit den 90er Jahren (damals noch Win Commander (und der sah damals schon so aus 😁)) und kenne mich mit dem aus, deswegen bleibe ich dabei. Für das wofür ich ihn verwende reicht mir der. Aber sicher, wenn man sowas in der Richtung neu sucht, dann kann man natürlich auch diesen FreeCommander verwenden.
Ich habe ihn mir jetzt mal zusätzlich installiert und werde da mal ein bisschen mit rumspielen.
TK1987
TK1987 10.05.2022 aktualisiert um 14:47:07 Uhr
Goto Top
Zitat von @DOCTEC:
Aber der FreeCommander hat ja ein ganz furchtbares, modernes Design 🤪 !!!
Na das hab ich doch schon von Anfang an gesagt 👇
Zitat von @TK1987:
IMHO ist dieser dem TotalCommander in nahezu jeder Hinsicht überlegen
😜
kleinerbub
kleinerbub 17.05.2022 aktualisiert um 09:19:44 Uhr
Goto Top
Vielen Dank für das PS-Script @TK1987.
Das funktioniert. Ich habe es noch ein wenig abgeändert, sodass es nur PDFs verarbeitet und das aktuelle Verzeichnis als Quelle nimmt.
Hier nochmal der komplette Code:

# Zielpfad
$Target = "\\server\rechnungen"  

# Zu entfernende Zeichen
$illegalChars = ".#+"  

# Regex-Replace-String aus zu entfernenden Zeichen bilden
$replace = $illegalChars.ToCharArray().Foreach({[regex]::Escape($_)}) -join '|'  

# Für jede Datei im Quellpfad...
Foreach ($File in Get-ChildItem -File "*.pdf") {  

  # Datei an Zielpfad verschieben und umbenennen
  Move-Item -Path $File -Destination "$Target\$($File.BaseName -replace $replace)$($File.Extension)"  
  
} # Ende der Foreach-Schleife
kleinerbub
kleinerbub 17.05.2022 um 09:45:06 Uhr
Goto Top
Zitat von @141986:

auch keine Begrüßung,

was hast Du denn schon erarbeitet?

Code wäre nett face-smile

VG

Das PS-Script von @TK1987 funktioniert zwar, aber wie eine Batch-Lösung aussehen könnte, würde mich trotzdem interessieren.

Hier ist mein Snippet, was ich quick 'n dirty versucht habe 🙈

@echo off & setlocal enabledelayedexpansion

set target=\\server\rechnungen
set illegalchars=.#+

::Versuch 1
REM for /F "eol=| delims=" %%I in ('dir "*.pdf" /A-D /B 2^>nul') do for /F "tokens=* delims=%illegalchars%" %%A in ("%%~nI") do ECHO ren "%%I" "%%A%%~xI"  

::Versuch 2
REM for /F "eol=| delims=" %%I in ('dir "*.pdf" /A-D /B 2^>nul') do for /F "tokens=* delims=%illegalchars%" %%A in ("%%~nI") do ECHO ren "%%I" "%%I:%%~xI"  

::Versuch 3
for %%i in (*.pdf) do (
set "filename=%%i"  
ren "%%i" "%%i:+=%"  
ren "%%i" "%filename:#=%"  
)

Ich bin leider nicht so sattelfest, was Batch-Code angeht. Kann sein, dass das Snippet nicht ganz plausibel ist. Aber vielleicht mag ja einer noch was basteln.

Gruß kleinerbub
TK1987
Lösung TK1987 17.05.2022 aktualisiert um 10:54:16 Uhr
Goto Top
Moin,

Zitat von @kleinerbub:
Das PS-Script von @TK1987 funktioniert zwar, aber wie eine Batch-Lösung aussehen könnte, würde mich trotzdem interessieren.

in etwa so:
@echo off
set target=\\server\rechnungen
for %%A in ("*.pdf") do call :Replace "%%A"  
goto :EoF

:Replace
set Filename=%~n1
set Filename=%Filename:.=%
set Filename=%Filename:#=%
set Filename=%Filename:+=%
move "%~1" "%target%\%Filename%%~x1"  

Wie bereits erwähnt: Für die verwendeten Zeichen funktioniert das zwar, aber bei der Verwendung spezieller Zeichen bekommst du Probleme. Unter anderem machen auch die Umlaute "äöü" und das "ß" mit Batch immer Probleme.

Gruß Thomas

PS:
Imho ist es besser, alle deine Skripte an einem zentralen Ort zu speichern (und mit einem Quellpfad zu arbeiten), statt die Skripte in den Ordnern zu lagern, die sie bearbeiten.
Zum einen brauchst du so später nur den einen Skriptordner zu kopieren, wenn du mal auf einen neuen Rechner umziehst - zum anderen wird das Skript selbst so nicht gelistet, wenn du von diesem aus alle Dateien im Quellordner verarbeiten lässt.
kleinerbub
kleinerbub 18.05.2022 um 09:23:52 Uhr
Goto Top
Morschn.

Das Batch-Script funktioniert ebenfalls.
Vielen Dank dafür!

Auch danke für die anderen Empfehlungen. Den FreeCommander nutze ich auch ab und zu für spezielle Dinge.
Noch ein Tool-Tipp (welch feines Homonym 😄) von mir zum Thema Batch-Umbenennung: Advanced Renamer

Gruß kleinerbub