Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Sonderzeichen in Ordner und Dateinamen mit VBScript ersetzen. (bastlas script)

Frage Entwicklung VB for Applications

Mitglied: 82312

82312 (Level 1)

24.11.2009, aktualisiert 15:44 Uhr, 12773 Aufrufe, 15 Kommentare

Hallo Zusammen,

ich habe folgendes mit der Suchfunktion gefunden:

https://www.administrator.de/index.php?content=73180#283532
http://www.administrator.de/index.php?content=116440

Das Skript funktioniert soweit auch wunderbar. Danke an bastla für dieses Skript.

Mein Problem ist nun, das bei mir wirklich ALLE Sonderzeichen die in folgender ASCII Tabelle stehen durch "_" ersetz werden sollen.

http://www.torsten-horn.de/techdocs/ascii.htm

Wie kann ich die "SonderzeichenErsetzung.txt" so erweitern, dass diese Zeichen nun auch ersetz werden?
Ich habe schon einiges probiert, bin aber nicht so ganz fit mit den verschiedenen Codes.

Vielen Dank,
baeks

*EDIT*

Ich habe noch einen Script von bastla gefunden. Die Version mit der Liste von Zeichen die zugelassen werden scheint mir sinnvoller als eine Liste von Zeichen die nicht zugelassen werden, da sie viel kürzer ist. Ist es möglich auch Ordner damit umzubenennen?
Mitglied: 76109
24.11.2009 um 15:15 Uhr
Hallo baeks1986!

Mit Deinem Problem habe ich mich noch nicht beschäftigt, aber die Scancodes auf Deiner Website sind teilweise nicht korrekt. Hier eine Excel-Tabelle mit den kompletten Scancodes der erweiterten MFII-Tastatur:
f11c91034327d4ed12d7d81f3604bb78-scancodes - Klicke auf das Bild, um es zu vergrößern

Gruß Dieter
Bitte warten ..
Mitglied: 82312
24.11.2009 um 15:40 Uhr
Danke für den Hinweis, aber ich hatte die Tabelle mit Asc() und Chr() stichprobenartig geprüft und habe keine fehler gefunden, welche sollen denn falsch sein?

Gruss
baeks
Bitte warten ..
Mitglied: 76109
24.11.2009 um 16:21 Uhr
Hallo braeks1986!

habe nicht alle durchgesehen, aber zumindest diese beiden Scancodes stimmen nicht:
2B - "<" falsch = 56h
29 - "#" falsch = 2Bh

Fehlt z.B.:
Space = 39h

Gruß Dieter
Bitte warten ..
Mitglied: 76109
25.11.2009 um 07:29 Uhr
Hallo baeks1986!

Im Prinzip, muss nur die Ersetzen-Liste mit den Sonderzeichen entsprechend erweitert werden. Sollen z.B. die Zeichen "§$#" durch "_" ersetzt werden, dann müsstest Du nur "_,§,$,#" in einer neuen Zeile anfügen. Ansonsten wäre es hilfreich, wenn Du erstmal klar definierst, was Deiner Meinung nach alles zu den Sonderzeichen zählt und/oder welche Zeichen zugelassen sind und ob Htm-Pseudos auch berücksicht werden müssen und und und???

Gruß Dieter
Bitte warten ..
Mitglied: 82312
25.11.2009 um 10:01 Uhr
Sonderzeichen sind bei mir in dem Fall alle Zeichen, die nicht AaBb [...]Zz und nicht 0123456789 sind. Genau das meinte ich, wie kann ich diese Tabelle erweitern, ich habe den Aufbau der ersetzen Tabelle noch nicht ganz verstanden.
Bitte warten ..
Mitglied: 76109
25.11.2009 um 10:21 Uhr
Hallo baeks1986!

Die Ersetzen-Funktion und Ersetzentabelle ist so aufgebaut, dass der Zeichen-Teil vor dem ersten Komma, alle nachfolgenden durch Kommagetrennte Zeichen ersetzt. Das können 1 Zeichen oder Zeichenfolgen wie bei den Htm-Pseudos sein.

Beispiel: _,§,$,ä,ö,ü,text

"§" wird ersetzt durch "_"
"$" wird ersetzt durch "_"
"ä" wird ersetzt durch "_"
"ö" wird ersetzt durch "_"
"ü" wird ersetzt durch "_"
"text" wird ersetzt durch "_"

Und was ist mit den Htm-Pseudos z.b. &uuml; oder %C0 und Umlauten. Hast Du Htm-Pseudos in Deinen Datei- und Ordnernamen?

Wenn nicht, würde man keine Ersetzen-Tabelle benötigen und das Ganze mit einer If- oder Case-Anweisungen lösen.

Gruß Dieter
Bitte warten ..
Mitglied: 82312
25.11.2009 um 18:21 Uhr
Hi Dieter,

danke schonmal für deine Hilfe, in meinen Dateinamen kommen keine HTM-Pseudos vor. Wie würde die Case-Anweisung dann aussehen?

Select Case Zeichen
Case "$"
?????
Case "%"
?????
End Select

Und die ???? sind dann die Ersetzen funktion?

Ich glaube ich mach das doch mit der Tabelle, scheint mir einfacher und ist dann wohl auch für dich/euch einfacher mir zu erklären.

Vielen Dank schonmal,
Max
Bitte warten ..
Mitglied: 76109
25.11.2009 um 21:54 Uhr
Hallo baeks1986!

Eigentlich hatte ich an so was gedacht, aber leider geht das nur in VBA. In VBS gibt es keinen To-Operator:
01.
Select Case c 
02.
    Case "A" To "Z" 
03.
    Case "a" To "z" 
04.
    Case "0" To "9" 
05.
    Case Else 
06.
         'Tue Was 
07.
End Select
In VBS dann entweder so (das gleiche in Grün):
01.
Function ReplaceSpecialChar(ByRef Text) 
02.
     
03.
    s = Text 
04.
     
05.
    For i = 1 To Len(s) 
06.
        c = Mid(s, i, 1) 
07.
        If c >= "0" And c <= "9" Then	'Wenn True Do Nothing 
08.
        ElseIf c >= "A" And c <= "Z" Then	'Wenn True Do Nothing 
09.
        ElseIf c >= "a" And c <= "z" Then	'Wenn True Do Nothing 
10.
        Else 
11.
             s = Replace(s, c, "_")		'Wenn False Do Replace 
12.
        End If 
13.
    Next 
14.
     
15.
    ReplaceSpecialChar = s 
16.
End Function
oder etwas aufwendiger so:
01.
Function ReplaceSpecialChar(ByRef Text) 
02.
     
03.
    s = Text 
04.
     
05.
    For i = 1 To Len(s) 
06.
        c = Mid(s, i, 1) 
07.
        Select Case c 
08.
            Case "0","1","2","3","4","5","6","7","8","9" 
09.
            Case "A","B","C","D","E","F","G","H","I","J","K","L","M", _ 
10.
                 "N","O","P","Q","R","S","T","U","V","W","X","Y","Z" 
11.
            Case "a","b","c","d","e","f","g","h","i","j","k","l","m", _ 
12.
                 "n","o","p","q","r","s","t","u","v","w","x","y","z" 
13.
            Case Else 
14.
                s = Replace(s, c, "_") 
15.
        End Select 
16.
    Next 
17.
     
18.
    ReplaceSpecialChar = s 
19.
End Function
Oder zwecks Wartungsfreundlichkeit doch die Sonderzeichen.Txt anpassen. Du hast die Freie Auswahl

Gruß Dieter
Bitte warten ..
Mitglied: 82312
26.11.2009 um 08:30 Uhr
Vielen Dank für deinen freundlichen Support. Damit sollte das Problem behoben sein.

Danke, Danke, Danke...
Bitte warten ..
Mitglied: 76109
26.11.2009 um 10:11 Uhr
Hallo Max!

Gern geschehen

Gruß Dieter
Bitte warten ..
Mitglied: 82312
26.11.2009 um 11:41 Uhr
Ich habe das Script jetzt auf meine Bedürfnisse angepasst. Ich poste es einfach mal:

01.
'ReplaceSpecialSings,vbs 
02.
 
03.
sSonder = InputBox("Please define the SpecialSigns.txt:","ReplaceSpecialSigns","PFAD") 
04.
sFolder = InputBox("Please define the Folder where everything should be replaced:","ReplaceSpecialSigns","PFAD") 
05.
 
06.
Set oFSO = CreateObject("Scripting.FileSystemObject") 
07.
Set oSonder = oFSO.OpenTextFile(sSonder, 1) 
08.
 
09.
If Not oSonder.AtEndOfStream Then  
10.
     aSonder = Split(oSonder.ReadAll, vbCrLF) 
11.
Else 
12.
     MsgBox ("Sonderzeichendatei " & sSonder & " enthält keine Daten!") 
13.
End If 
14.
oSonder.Close 
15.
 
16.
ProcessFolder(oFSO.GetFolder(sFolder)) 
17.
Sub ProcessFolder(oFolder) 
18.
sNameOld = oFolder.Name 
19.
 
20.
sNameNew = ReplaceSpecialChars(sNameOld) 
21.
If Not oFSO.FolderExists(oFolder.ParentFolder & "\" & sNameNew) Then 
22.
    oFolder.Name = sNameNew 
23.
Else 
24.
    If sNameOld <> sNameNew Then oProtokoll.WriteLine oFolder.Path 
25.
End If 
26.
 
27.
For Each oFile In oFolder.Files 
28.
    sNameOld = Left(oFile.Name, InStrRev(oFile.Name, ".") - 1) 
29.
    sType = Mid(oFile.Name, InStrRev(oFile.Name, ".")) 
30.
 
31.
    sNameNew = ReplaceSpecialChars(sNameOld) 
32.
    If Not oFSO.FileExists(oFile.ParentFolder & "\" & sNameNew & sType) Then 
33.
        oFile.Name = sNameNew & sType 
34.
    End If 
35.
     
36.
    Next 
37.
 
38.
For Each oSubFolder In oFolder.SubFolders 
39.
    ProcessFolder(oSubFolder) 
40.
Next 
41.
End Sub 
42.
 
43.
Function ReplaceSpecialChars(sOld) 
44.
sTemp = sOld 
45.
For Each sLine In aSonder 
46.
    aChars = Split(sLine, ",") 
47.
    For i = 1 To UBound(aChars) 
48.
        sTemp = Replace(sTemp, aChars(i), aChars(0)) 
49.
    Next 
50.
Next 
51.
ReplaceSpecialChars = sTemp 
52.
End Function 
53.
MsgBox "Finished...",64,"...---'''COMPLETED'''---..."
zusätzlich benötigt man die Datei mit den Sonderzeichen die ersetz werden sollen.
Bitte warten ..
Mitglied: 76109
26.11.2009 um 12:09 Uhr
Hallo baeks1986!

Schön, dass Du den Code nochmal komplett gepostet hast

Die Zeile 12 könntest Du allerdings noch entfernen, da die gleiche Anweisung in Zeile 15 steht und die Datei unabhängig von True/False schließt

Gruß Dieter
Bitte warten ..
Mitglied: 82312
26.11.2009 um 15:53 Uhr
Oh, ja danke. Wird gemacht...

Wenn du Lust und Zeit hast würde ich gerne weiter an dem Script arbeiten. Ich soll diesen Script jetzt noch eweitern auf:

1. die Datei und Ordnernamen dürfen nicht länger als 240 Zeichen sein. (Habs schon geschafft das ende abzuschneiden, aber dann ist die Endung ja immer mit weg, und das will ja keiner also müsste ich das irgendwie von vorne abschneiden.

2. Sollen jetzt alle Files die größer als 25 MB sind in einen gesonderten Ordner geschoben werden, der aber die selben Ordnernamen beinhaltet wie die wo er vorher drin war...Ich weis, ist schlecht erklärt aber ich versuche es mal anhand eines Beispiels.

Ordner1
|_ Ordner2
|_Ordner3
|_hier liegen die 25MB+ Files
|_außerdem liegen hier noch enttliche andere Files


Jetzt soll die 25MB+ Datei so verschoben werden:

Ordner1
|_ Ordner2
|_Ordner3
|_ettliche andere Files aber KEINE File 25MB+


KopieOrdner1
|_KopieOrdner2
|_KopieOrdner3
|_hier liegen jetzt die 25MB+ Files aber KEINE anderen

Ist das so verständlich?

Für 1. habe ich gedacht man könnte das irgéndwie mit InStr() oder Len() Pos() Left() oder so lösen, bin aber bis jetzt nicht auf den richtigen Pfad gekommen.

Für 2. habe ich an ein Select Case gedacht mit GetFile.Size aber meine großes Problem ist dann die Ordner so wie oben angegeben zu erstellen.

Hast du/ihr da eine Idee?


Gruss,
Max
Bitte warten ..
Mitglied: 76109
26.11.2009 um 21:08 Uhr
Hallo baeks1986!

In Deinem Code Zeile 27 hast Du ja bereits eine Zerlegung des Dateinamens. Z.B. Datei = MeineDatei.Xyz
01.
For Each oFile In oFolder.Files 
02.
    sNameOld = Left(oFile.Name, InStrRev(oFile.Name, ".") - 1)    '= MeineDatei 
03.
    sType = Mid(oFile.Name, InStrRev(oFile.Name, "."))            '= Xyz 
04.
Next
Das kann man entsprechend erweitern z.B. Datei-Pfad = X:\Test1\Test2\Datei.Xyz
01.
For Each oFile In oFolder.Files 
02.
    sSize = oFile.Size                               '= Size in Byte 
03.
    sPath = oFile.Path                               '= X:\Test1\Test2\Datei.Xyz 
04.
    sFolder1 = oFolder.Path                          '= X:\Test1\Test2 
05.
    sFolder2 = oFolder.ParentFolder                  '= X:\Test1 
06.
    sFolder3 = oFolder.Name                          '= Test2 
07.
    sFile = oFile.Name                               '= Datei.Xyz 
08.
    sName = oFso.GetBaseName(sPath)                  '= Datei 
09.
    sType = oFso.GetExtensionName(sPath)             '= Xyz 
10.
 
11.
   'Weitere Funktionen 
12.
    nFolder = sFolder2 & "\Kopie" & sFolder3         '= X:\Test1\KopieTest2 
13.
    nPath = oFso.BuildPath(nFolder, sFile)           '= X:\Test1\KopieTest2\Datei.Xyz 
14.
     
15.
    If sSize > MaxSize Then                          'Test Size 
16.
        If Not oFso.FolderExists(nFolder) Then       'Test Folder Exists 
17.
            oFso.CreateFolder (nFolder)              'Create Kopie-Folder 
18.
        End If 
19.
        oFso.MoveFile sPath, nPath                   'Move File 
20.
    End If 
21.
Next
Das sollte Dir weiterhelfen

Gruß Dieter
Bitte warten ..
Mitglied: 82312
27.11.2009 um 12:23 Uhr
Ja das hilft auf jedenfall

Mein Problem ist nur, dass die Pfade ALLE dynamisch sind, dieser Script soll bei übernahme von anderen Firmen und eingliederung in unser Netzwerk laufen...
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...