CMD - Stern und Sonderzeichen in Dateinamen entfernen
Gueten Tag zusammen
Mit grossem Interesse lese ich euer Beiträge (und würde mich an dieser Stelle als Azubi bezeichnen).
Eure Tips und Tricks haben mir schon bei manchem Problem geholfen.
Nun aber komme ich nicht mehr weiter...Folgendes:
In einem batch wird der Dateiname an ein Programm weitergereicht.
Nun kann es vorkommen, dass der Dateiname das Zeichen * (Stern) beinhaltet.
Bsp: "Adobe Acrobat XI * Adobe PDF-Konvertierungseinstellungen.pdf"
Bis jetzt habe ich es nicht geschfft, das Zeichen * zu entfernen oder durch das _ zu ersetzen.
Folgende Varianten habe ich schon ausprobiert...
Variante 1
setlocal enabledelayedexpansion
SET "Filename=%Filename:\=_%"
SET "Filename=%Filename:/=_%"
SET "Filename=%Filename::=_%"
SET "Filename=%Filename:?=_%"
SET "Filename=%Filename:<=_%"
SET "Filename=%Filename:>=_%"
SET "Filename=%Filename:|=_%"
SET "Filename=%Filename:"=_%"
SET "Filename=%Filename:*=_%"
Variante 2
setlocal enabledelayedexpansion
SET "search=: / . ? & = % * "
for %%s in (!search!) do (
SET "Filename=!Filename:%%~s=_!"
)
Hat jemand von euch eine Idee?
Über eure Hilfe würde ich mich freuen, batch2go
Mit grossem Interesse lese ich euer Beiträge (und würde mich an dieser Stelle als Azubi bezeichnen).
Eure Tips und Tricks haben mir schon bei manchem Problem geholfen.
Nun aber komme ich nicht mehr weiter...Folgendes:
In einem batch wird der Dateiname an ein Programm weitergereicht.
Nun kann es vorkommen, dass der Dateiname das Zeichen * (Stern) beinhaltet.
Bsp: "Adobe Acrobat XI * Adobe PDF-Konvertierungseinstellungen.pdf"
Bis jetzt habe ich es nicht geschfft, das Zeichen * zu entfernen oder durch das _ zu ersetzen.
Folgende Varianten habe ich schon ausprobiert...
Variante 1
setlocal enabledelayedexpansion
SET "Filename=%Filename:\=_%"
SET "Filename=%Filename:/=_%"
SET "Filename=%Filename::=_%"
SET "Filename=%Filename:?=_%"
SET "Filename=%Filename:<=_%"
SET "Filename=%Filename:>=_%"
SET "Filename=%Filename:|=_%"
SET "Filename=%Filename:"=_%"
SET "Filename=%Filename:*=_%"
Variante 2
setlocal enabledelayedexpansion
SET "search=: / . ? & = % * "
for %%s in (!search!) do (
SET "Filename=!Filename:%%~s=_!"
)
Hat jemand von euch eine Idee?
Über eure Hilfe würde ich mich freuen, batch2go
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 233399
Url: https://administrator.de/forum/cmd-stern-und-sonderzeichen-in-dateinamen-entfernen-233399.html
Ausgedruckt am: 22.04.2025 um 11:04 Uhr
14 Kommentare
Neuester Kommentar
Hallo,
Dir ist schon klar das dieses * Zeichen eben nicht in einen Dateinamen verwendet werden kann? Wo also kommen diese Dateien mit diesen angeblichen Stern * darin dann her? Welches Dateisystem liegt darunter, NTFS sicherlich nicht, oder? Mit welchem Zeichensatz wird es dargestellt oder wurde es erzeugt (nicht das es sich um einzulässiges Zeichen eines anderen Zeichensatzes handelt)? Und, mit welchem OS arbeitest du hier?
Mal mit einen Hexeditor dir die Verzechnissinhaltsliste angeschaut?
Gruß,
Peter
Dir ist schon klar das dieses * Zeichen eben nicht in einen Dateinamen verwendet werden kann? Wo also kommen diese Dateien mit diesen angeblichen Stern * darin dann her? Welches Dateisystem liegt darunter, NTFS sicherlich nicht, oder? Mit welchem Zeichensatz wird es dargestellt oder wurde es erzeugt (nicht das es sich um einzulässiges Zeichen eines anderen Zeichensatzes handelt)? Und, mit welchem OS arbeitest du hier?
Bsp: "Adobe Acrobat XI * Adobe PDF-Konvertierungseinstellungen.pdf"
Versuch mal eine datei mit namen "Das ist eine * Stern Datei.txt" zu erzeugen.Mal mit einen Hexeditor dir die Verzechnissinhaltsliste angeschaut?
Gruß,
Peter
Hallo batch2go,
zeichenweise könnte bspw. so aussehen:
Wie gesagt, die Performance ist da nicht berauschend...
Grüße
rubberman
zeichenweise könnte bspw. so aussehen:
@echo off &setlocal
set "filename=;a/b\c:d?e*f<g>h|i"j !%%^^^&=~.ext"
:: Vorher ::
setlocal EnableDelayedExpansion
echo !filename!
endlocal
set "newname=" &set "as=*" &set "qm=?" &set "qt=""
for /f delims^=^ eol^= %%i in ('cmd /von /u /c "echo(!filename!"^|find /v ""^|findstr .') do (
set "char=%%i"
setlocal EnableDelayedExpansion
for %%j in ("\" "/" ":" "^!as^!" "^!qm^!" "^!qt^!" "<" ">" "|") do if "!char!"=="%%~j" set "char=_"
for /f delims^=^ eol^= %%j in ("!newname!!char!") do (endlocal &set "newname=%%j")
)
set "filename=%newname%"
:: Danach
setlocal EnableDelayedExpansion
echo !filename!
endlocal
pause
Grüße
rubberman
Hallo batch2go.
Dann kannst du auch meinen Vorschlag von oben nutzen. Zwischen unterschiedlichen Scripten zu wechseln (bspw. für jeden Dateiname ein VBScript / JScript / Powershellscript o.Ä. aufzurufen) "verschlimmbessert" die Performance höchstens. Wenn, dann komplett in einer anderen Sprache ...
Grüße
rubberman
vorausgesetzt das batch ruft ein XY auf und stellt den 'korrigierten' Dateinamen dem batch wieder zur Verfügung
Dann kannst du auch meinen Vorschlag von oben nutzen. Zwischen unterschiedlichen Scripten zu wechseln (bspw. für jeden Dateiname ein VBScript / JScript / Powershellscript o.Ä. aufzurufen) "verschlimmbessert" die Performance höchstens. Wenn, dann komplett in einer anderen Sprache ...
Grüße
rubberman
Hi batch2go,
kannst du z.B. auch mit einem VB-Script machen:
das du dann so in deiner Batch aufrufst:
und wenn man möchte lässt sich das dann auch komplett in dein Batchscript einarbeiten ...
mit Powershell gehts so:
Und mit sed für Windows geht's noch kürzer wenn das gewünscht ist.
Grüße Uwe
kannst du z.B. auch mit einem VB-Script machen:
Set regex = CreateObject("vbscript.regexp")
strFile = WScript.Arguments(0)
regex.Global = True
regex.Pattern = "[\\/:?<>|""*]"
strNewFile = regex.Replace(strFile,"_")
WScript.Echo strNewFile
@echo off & setlocal
set "old_filename=bl<abl?u*b |.ext"
for /f "delims=" %%a in ('cscript //Nologo replacechars.vbs "%old_filename%"') DO set new_filename=%%a
echo %new_filename%
mit Powershell gehts so:
param([string]$strFilename)
$stringNEW = $strFilename -replace '[\\/:?<>|"*]','_'
$stringNEW
Und mit sed für Windows geht's noch kürzer wenn das gewünscht ist.
Grüße Uwe
Hallo batch2go,
der Doppelpunkt ist optional (zumindest auf den mir bekannten Windowsversionen). Die Art und Weise aus der Unicodeausgabe eines Strings die einzelnen Buchstaben zu verarbeiten, stammt übrigens von @pieh-ejdsch, siehe Batch Stringlänge bestimmen (zB. Zeilenlänge, Offset von Zeichen, Spaltenanzahl).
Mit deinem
Nutze im Forum doch bitte Code Tags, dann grenzt du dein Programm vom restlichen Text ab und Einrückungen bleiben erhalten.
<code>Dein Code hier...</code>
Grüße
rubberman
der Doppelpunkt ist optional (zumindest auf den mir bekannten Windowsversionen). Die Art und Weise aus der Unicodeausgabe eines Strings die einzelnen Buchstaben zu verarbeiten, stammt übrigens von @pieh-ejdsch, siehe Batch Stringlänge bestimmen (zB. Zeilenlänge, Offset von Zeichen, Spaltenanzahl).
Mit deinem
setlocal enabledelayedexpansion
am Anfang solltest du vorsichtig sein. Ausrufezeichen in deinen Dateinamen werden so im Nu eliminiert. Das ist der Grund warum ich zur verzögerten Variablenerweiterung wechsle, wenn sie benötigt wird und mit endlocal
wieder zurück zum "Normal" gehe wenn's kritisch wird. Besser du bleibst bei der Version, wie ich sie dir vorgeturnt habe Nutze im Forum doch bitte Code Tags, dann grenzt du dein Programm vom restlichen Text ab und Einrückungen bleiben erhalten.
<code>Dein Code hier...</code>
Grüße
rubberman
So Z.b. :
Wenn dann mehrere verbotene Zeichen hintereinander kommen
werden dann auch nicht zich Ersatz eingefügt !
Option Strict On
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox(CleanFilename("Ich ---- habe * immer # Hunger", "- *#", " "))
End Sub
Public Function CleanFilename(ByVal Dateiname As String, ByVal Verbotene_Zeivhen As String, ByVal Ersatzzeichen As String) As String
Dim s As String = System.Text.RegularExpressions.Regex.Replace(Dateiname, "[" & Verbotene_Zeivhen & "]+", Ersatzzeichen)
Return s
End Function
End Class
EINGANG = (( Ich ---- habe * immer # Hunger ))
VERBOTENE ZEICHEN = (( - *# ))
ERSATZZEICHEN = (( " " ))
AUSGANG = (( Ich habe immer Hunger ))
Und dann das ganze in ne schleife stecken um ganze Ordner mit Dateien zu putzen !
Z.b:
Option Strict On
Public Class Form1
Dim Verbotene_Zeichen As String = "* #?"
Dim Ersatzzeichen As String = " "
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
For Each Dateien In My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath)
Dim Dateiname As String = IO.Path.GetFileName(Dateien)
Try
My.Computer.FileSystem.RenameFile(Dateien, Clean_Dateiname(Dateiname, Verbotene_Zeichen, Ersatzzeichen))
Catch ex As Exception
End Try
Next
End If
End Sub
Public Function Clean_Dateiname(ByVal Dateiname As String, ByVal Verbotene_Zeichen As String, ByVal Ersatzzeichen As String) As String
Return System.Text.RegularExpressions.Regex.Replace(Dateiname, "[" & Verbotene_Zeichen & "]+", Ersatzzeichen)
End Function
End Class
Test Tool Download:
https://www.dropbox.com/sh/jmml4shrlvl2jhv/AACXtqaeYx9i4hEKo3IBkfH9a/OD% ...
LG Loki1979
Wenn dann mehrere verbotene Zeichen hintereinander kommen
werden dann auch nicht zich Ersatz eingefügt !
Option Strict On
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox(CleanFilename("Ich ---- habe * immer # Hunger", "- *#", " "))
End Sub
Public Function CleanFilename(ByVal Dateiname As String, ByVal Verbotene_Zeivhen As String, ByVal Ersatzzeichen As String) As String
Dim s As String = System.Text.RegularExpressions.Regex.Replace(Dateiname, "[" & Verbotene_Zeivhen & "]+", Ersatzzeichen)
Return s
End Function
End Class
EINGANG = (( Ich ---- habe * immer # Hunger ))
VERBOTENE ZEICHEN = (( - *# ))
ERSATZZEICHEN = (( " " ))
AUSGANG = (( Ich habe immer Hunger ))
Und dann das ganze in ne schleife stecken um ganze Ordner mit Dateien zu putzen !
Z.b:
Option Strict On
Public Class Form1
Dim Verbotene_Zeichen As String = "* #?"
Dim Ersatzzeichen As String = " "
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
For Each Dateien In My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath)
Dim Dateiname As String = IO.Path.GetFileName(Dateien)
Try
My.Computer.FileSystem.RenameFile(Dateien, Clean_Dateiname(Dateiname, Verbotene_Zeichen, Ersatzzeichen))
Catch ex As Exception
End Try
Next
End If
End Sub
Public Function Clean_Dateiname(ByVal Dateiname As String, ByVal Verbotene_Zeichen As String, ByVal Ersatzzeichen As String) As String
Return System.Text.RegularExpressions.Regex.Replace(Dateiname, "[" & Verbotene_Zeichen & "]+", Ersatzzeichen)
End Function
End Class
Test Tool Download:
https://www.dropbox.com/sh/jmml4shrlvl2jhv/AACXtqaeYx9i4hEKo3IBkfH9a/OD% ...
LG Loki1979
Hallo Loki1979,
Bitte nutze Code-Tags für das Posten von Quellcode:
Grüße Uwe
Bitte nutze Code-Tags für das Posten von Quellcode:
<code> Quellcode </code>
, ansonsten kommen hier eventuell wichtige Sonderzeichen abhanden. Merci.Grüße Uwe