hggigo
Goto Top

Sonderzeichen aus Datei- u. Ordnernamen entfernen bzw. ersetzen per bat o. vbs

Schön guten Tag,

zur zeit Arbeiten wir auf unserem Eigenen Server, dieser wird aber von einem Fremdunternehmen, welches uns bald im Zielbetrieb übernimmt vereinnahmt und auf deren Server kopiert.

Jetzt das Problem: Auf dem neuen Server können nur Daten gespeichert werden die keine Sonderzeichen oder Leerzeichen enthalten. Alles was nicht bis zur Übernahme umbenannt ist verschwindet einfach... face-sad

Ich muss also die über 4 Mio. Dateien und Ordner umbenennen, bin aber nicht sehr begabt mit VBScript bzw. mit Batch! Es können auch keine Tool genutzt werden, da wir schon zum Teil übernommen sind ist mir dies nicht mehr Möglich... Müsste Quasi auch das Script per Hand abschreiben um es ins System zu bekommen.
Kommentar vom Moderator Biber am Oct 27, 2009 um 20:31:51 Uhr
Verschoben von "Netzwerküberwachung und Protokolle" nach "Batch & Shell".
(da wird es vielleicht vom nächsten Suchenden besser gefunden)

Content-Key: 128037

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: TsukiSan
TsukiSan Oct 27, 2009 at 15:50:04 (UTC)
Goto Top
dir könnte dieses Replace-Script helfen
on error resume next

Dim FilterStr , PfadStr
Dim PfadStrNeu, DateiNameNeu
Dim Alt, Neu
Dim MyText()
Dim  X , ZX
Dim ZMAx

FilterStr = "*.*"  
X = 0
ZMax = 0
LogPath = "D:\Replace.txt"  
FN = ""  
FNR = ""  
vbTextCompare = 1


Set objWord = CreateObject("Word.Application")  
Set FSO = CreateObject("Scripting.FileSystemObject")  

Set MyLogFile = FSO.CreateTextFile(LogPath, TRUE)
MyLogFile.Close



PfadStr = inputbox("Bitte den kompletten Pfad zu dem zu durchsuchenden Ordner eingeben.","Pfadangabe...","D:\1\")  
PfadStrNeu = PfadStr & "ReplacedFiles\"  

FSO.CreateFolder(PfadStrNeu)

Alt = inputbox("Bitte die zu ersetzende Zeichenkette eingeben...", "Alte Zeichenkette...", "ä")   
Neu = inputbox("Bitte die neue Zeichenkette eingeben...", "Neue Zeichenkette...", "ae")   

msgbox "Befehl wird ausgeführt! Bitte warten!",,"Mit Word...."  

objWord.FileSearch.FileName = FilterStr
objWord.FileSearch.LookIn = PfadStr
objWord.FileSearch.SearchSubfolders = False
objWord.FileSearch.Execute


objWord.Visible = False

Set MyLogFile = FSO.OpenTextFile(LogPath, 8)
MyLogFile.WriteLine (Time & "|Beginne Script: 'Replace_Strings_in_gesamten_Ordner.vbs'")  

For Each objFile in objWord.FileSearch.FoundFiles	
	
	MyLogFile.WriteLine (Time & "|  Oeffne Datei: " & ObjFile)  

'Jetzt holen wir uns nur den Dateinamen raus	  
	FN = ""  
	FNR = ""  
	IFN = ""  
	IFNR = ""  
	for IFN = len(Objfile) to 0 Step -1
		FNTemp = mid (Objfile,IFN,1)
			If Not FNTemp = "\" then FN = FN & FNTemp  
			If FNTemp = "\" Then IFN = 0  
	next

'Hier wieder richtig rum drehen ;-)  
	for IFNR = len(FN) to 1 Step -1
		FNTempR = mid (FN,IFNR,1)
			FNR = FNR & FNTempR
	next

	ZMAx = 0
	Set MyDatei = FSO.OpenTextFile(objFile, 1)
	Do Until MyDatei.AtEndOfStream 
		TempText = MyDatei.ReadLine
		ZMAx = Zmax + 1 
	Loop
	MyDatei.close	
	
	ReDim MyText(ZMax)

	Set MyDatei = FSO.OpenTextFile(objFile, 1)
	Do Until MyDatei.AtEndOfStream 

		MyText(X) = MyDatei.ReadLine
	
		Tsuki = InStr(1,MyText(X), ALT, vbTextCompare)
	
		ZX = X
			If ZX < 10  then ZX = "0" & ZX  
			If ZX < 100 then ZX = "0" & ZX  

		IF Tsuki > 0 Then
			MyLogFile.WriteLine (Time & "|     Zeile " & ZX & ": [" & ALT & "] ersetzt durch [" & Neu & "]")  
		End If
		
		MyText(X) = Replace(MyText(X), Alt, Neu) 

		X = X + 1  

	Loop
	MyDatei.close
	

	PfadNeu = PfadStrNeu & FNR 

	MyLogFile.WriteLine (Time & "|Schreibe Datei: " & PfadNeu)  

	Set MyDatei1 = FSO.CreateTextFile(PfadNeu, TRUE)
	MyDatei1.Close
	
	Set MyDatei1 = FSO.OpenTextFile(PfadNeu, 8)
	for I = 0 to (X - 1)
		MyDatei1.WriteLine (MyText(I))
	next
	MyDatei1.Close
	
	X = 0
Next

MyLogFile.WriteLine (Time & "| Beende Script: 'Replace_Strings_in_gesamten_Ordner.vbs'")  
MyLogFile.Close

WScript.Echo Time & "| Script beendet."  

objword.quit

Set objword = nothing
Set MyDatei = nothing
Set FSO = nothing

Gruß
Tsuki
Member: Biber
Biber Oct 27, 2009, updated at Oct 18, 2012 at 16:39:47 (UTC)
Goto Top
Moin HGGIGO,

willkommen im Forum.
. Müsste Quasi auch das Script per Hand abschreiben um es ins System zu bekommen.
Tja, rein vom Naturell her würde ich diesen Oneliner eigentlich direkt am CMD-Prompt eintippen...

Okay, du solltest vorher das CMD-Fenster mit "mode con cols=166 lines=44" ein bisschen anpassen.

Zum Umbenennen der Dateien würde dieser (als Batch formatierte) Oneliner reichen:
:: ----snipp UmlautRen.bat ---
:: setlocal enableDelayedexpansion && REM falls bei euch nicht gesetzt

@echo off & FOR %%a in ("ä=ae" "ö=oe" "ü=ue" "ß=ss" " =") do (  
    FOR /f "tokens=1,2 delims==" %%y in ("%%~a") do (  
        FOR /R d:\temp %%i in ("*%%y*") do @(  
        Set "fileUml=%%~nxi"   
        ECHO ren "%%i" "!fileUml:%%~a!"  
    )))
Da der in der vorletzten virtuellen Zeile noch ein "ECHO ren" statt "ren" stehen hat, spielt der nur...

Demo:
(=19:01:34  D:\temp=)
>e:\schnipsel\UmlautRen.bat
ren "d:\temp\Bi-Bär 2009-123456.pdf" "Bi-Baer 2009-123456.pdf"
ren "d:\temp\präfix.bla" "praefix.bla"
ren "d:\temp\Backup1\Admincopy\SendTo\E-Mail-Empfänger.MAPIMail" "E-Mail-Empfaenger.MAPIMail"
ren "d:\temp\Backup1\Admincopy\Startmenü\Programme\Zubehör\Programmkompatibilitäts-Assistent.lnk" "Programmkompatibilitaets-Assistent.lnk"
ren "d:\temp\Backup1\tsprofil\SendTo\E-Mail-Empfänger.MAPIMail" "E-Mail-Empfaenger.MAPIMail"
ren "d:\temp\Hein Blöd 2009-123456.pdf" "Hein Bloed 2009-123456.pdf"
ren "d:\temp\testö mit Leerzeichen.xyz" "testoe mit Leerzeichen.xyz"
ren "d:\temp\ÖÖÖö.txt" "oeoeoeoe.txt"
ren "d:\temp\ÖÖÖÖÖ.txt" "oeoeoeoeoe.txt"
ren "d:\temp\Backup1\Admincopy\SendTo\Desktop (Verknüpfung erstellen).DeskLink" "Desktop (Verknuepfung erstellen).DeskLink"
ren "d:\temp\Backup1\Admincopy\Startmenü\Programme\Remoteunterstützung.lnk" "Remoteunterstuetzung.lnk"
ren "d:\temp\Backup1\tsprofil\SendTo\Desktop (Verknüpfung erstellen).DeskLink" "Desktop (Verknuepfung erstellen).DeskLink"
ren "d:\temp\testö mit Leerzeichen.xyz" "testömitLeerzeichen.xyz"
....

Diese Skizze hat EINEN großen Vorteil gegenüber TsukiSans Ansatz:
  • es werden nur die betroffenen Dateien (mit den definierten Sonderzeichen) angefasst - und nicht alle Dateien. ist etwas schneller.

und einen halben Vorteil hat es zusätzlich: Wenn du erst einmal mit "Echo ren.." statt "Ren" laufen lässt, dann hat du gleich eine Doku. face-wink

Nachteile:
  • es wird (und kann nicht werden!) NICHT unterschieden zwischen Gross- und Kleinschreibung. Aus " Änderungsprotokoll" wird "aenderungsprotokoll" statt "Aenderungsprotokoll.
  • es lässt sich vieles auch wieder zurückdrehen (aus ue wieder ü machen etc). Allerdings wird beim Zurückdrehen aus "Michael" ein "Michäl", aus Oldesloe wird Oldeslö.
Und die Leerzeichen lassen sich gar nicht wieder sinnvoll einstreuen.

Für <b>Ordner<b>- statt Dateinamen müsste eine leicht modifizierte Kopie der ersten Anweisung machbar sein.

Grüße
Biber

P.S. Übrigens gibt es unter Ersetzen von Zeichen in Datei- und Verzeichnisnamen in allen Unterordnern eine auch sehr nette Lösung von @pieh-ejdsch.

P.p.S. Falls jemand drüber stolpert, das [ren "d:\temp\testö mit Leerzeichen.xyz" "testömitLeerzeichen.xyz"] diese Zeile zweimal gefunden wird:
Es hat ja kein REName stattgefunden.... war ja nur Simulation mit ECHO...
Member: HGGIGO
HGGIGO Oct 27, 2009 at 20:20:53 (UTC)
Goto Top
WOW! Dankeschön


Hab Sie alle probiert und muss sagen die von [user:Mitglieder-ID: 78800] gefällt mir am besten... (Sry das ich diesen nicht gefunden hab)
Die anderen haben in meinem Test Verzeichnis nicht so richtig funktioniert!

Ich Danke euch das war super...

Tschü