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-Key: 2730351676

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

Printed on: April 24, 2024 at 09:04 o'clock

Mitglied: 141986
141986 May 09, 2022 at 12:18:24 (UTC)
Goto Top
auch keine Begrüßung,

was hast Du denn schon erarbeitet?

Code wäre nett face-smile

VG
Member: TK1987
Solution TK1987 May 09, 2022, updated at May 12, 2022 at 10:02:06 (UTC)
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
Member: DOCTEC
DOCTEC May 10, 2022 at 09:06:17 (UTC)
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
Member: TK1987
TK1987 May 10, 2022 at 10:39:54 (UTC)
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
Member: DOCTEC
DOCTEC May 10, 2022 at 11:57:07 (UTC)
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.
Member: TK1987
TK1987 May 10, 2022 updated at 12:47:07 (UTC)
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
😜
Member: kleinerbub
kleinerbub May 17, 2022 updated at 07:19:44 (UTC)
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
Member: kleinerbub
kleinerbub May 17, 2022 at 07:45:06 (UTC)
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
Member: TK1987
Solution TK1987 May 17, 2022 updated at 08:54:16 (UTC)
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.
Member: kleinerbub
kleinerbub May 18, 2022 at 07:23:52 (UTC)
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