VBScript - In einem Ordner bei allen Unterordner und allen Dateinamen nach eckigen Klammern suchen und diese durch Leerzeichen ersetzen
Hallo ans Forum
Ich habe ein kleines Problem. Ich bin nicht sonderlich bewandert mit Stringoperationen unter VBS.
Mein Script soll folgendes können:
Kann mir jemand helfen?
Bei PowerShell wüsste ich selbst, wie es ungefähr ginge, es muss aber leider VBS sein.....
Grüsse aus der Schweiz
TuXHunT3R
Ich habe ein kleines Problem. Ich bin nicht sonderlich bewandert mit Stringoperationen unter VBS.
Mein Script soll folgendes können:
- Alle Unterordner und Dateinamen eines Verzeichnisses in ein eindimensionales Array einlesen, welche ein [ und/oder ein ] enthalten
- Bei allen diesen Pfäden, die sich dann in diesem Array befinden, die [ und ] durch Leerzeichen ersetzen.
Kann mir jemand helfen?
Bei PowerShell wüsste ich selbst, wie es ungefähr ginge, es muss aber leider VBS sein.....
Grüsse aus der Schweiz
TuXHunT3R
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 90571
Url: https://administrator.de/forum/vbscript-in-einem-ordner-bei-allen-unterordner-und-allen-dateinamen-nach-eckigen-klammern-suchen-und-diese-90571.html
Ausgedruckt am: 17.04.2025 um 14:04 Uhr
16 Kommentare
Neuester Kommentar
Hallo TuXHunt3R!
Der Ablauf ist zwar etwas anders, als von Dir beschrieben, das Ergebnis sollte aber wie gewünscht sein:
Zum Testen habe ich den Ordner einfach eingetragen (Du hast ja auch nichts über die Art des Aufrufes geschrieben).
In dieser Fassung wird nicht rekursiv gearbeitet, es werden nur die Dateien und Unterordner des angegebenen Ordners erfasst.
Starten solltest Du über
aus einer CMD-Shell, da alle Array-Elemente am Ende zur Kontrolle ausgegeben werden (was mit einzelnen MsgBoxes etwas mühsam wird
).
Grüße
bastla
Der Ablauf ist zwar etwas anders, als von Dir beschrieben, das Ergebnis sollte aber wie gewünscht sein:
Ordner = "D:\Test"
Set fso = CreateObject("Scripting.FileSystemObject")
Set Folder = fso.GetFolder(Ordner)
For Each SubFolder In Folder.SubFolders
If InStr(SubFolder.Name, "]") Or InStr(SubFolder.Name, "[") Then
DirEntries = DirEntries & "[" & Replace(Replace(SubFolder.Name, "]", " "), "[", " ")
End If
Next
For Each File In Folder.Files
If InStr(File.Name, "]") Or InStr(File.Name, "[") Then
DirEntries = DirEntries & "[" & Replace(Replace(File.Name, "]", " "), "[", " ")
End If
Next
Arr = Split(Mid(DirEntries, 2), "[")
For i = 0 To UBound(Arr)
WScript.Echo i & vbTab & Arr(i)
Next
In dieser Fassung wird nicht rekursiv gearbeitet, es werden nur die Dateien und Unterordner des angegebenen Ordners erfasst.
Starten solltest Du über
cscript //nologo Script.vbs
Grüße
bastla
Geht halt bei VBScript nicht.....
Macht aber nix ... Na dann:
Ordner = "D:\Test"
Set fso = CreateObject("Scripting.FileSystemObject")
Set Fld = fso.GetFolder(Ordner)
DirEntries = ""
DoFolders(Fld)
Arr = Split(Mid(DirEntries, 2), "[")
For i = 0 To UBound(Arr)
WScript.Echo i & vbTab & Arr(i)
Next
'Ende Hauptprogramm
Sub DoFolders(Folder)
For Each SubFolder In Folder.SubFolders
If InStr(SubFolder.Name, "]") Or InStr(SubFolder.Name, "[") Then
DirEntries = DirEntries & "[" & Replace(Replace(SubFolder.Path, "]", " "), "[", " ")
End If
DoFolders(SubFolder)
Next
For Each File In Folder.Files
If InStr(File.Name, "]") Or InStr(File.Name, "[") Then
DirEntries = DirEntries & "[" & Replace(Replace(File.Path, "]", " "), "[", " ")
End If
Next
End Sub
Grüße
bastla
"DoFolders" ist das Unterprogramm, das die eigentliche Arbeit macht und sich selbst (rekursiv eben) aufruft.
"UBound(Arr)" liefert den höchsten Index des angegebenen Arrays.
Die beiden "Replace"-Vorgänge ersetzen sowohl "[" als auch "]" jeweils durch ein Leerzeichen - könntest Du natürlich auch auf zwei Zeilen aufteilen, etwa:
Die gesamte Zeile (oder diese beiden Zeilen) sorgt/sorgen dafür, dass jeder Pfad dem Sammelstring "DirEntries" hinzugefügt wird, wobei als Trennzeichen zwischen den einzelnen Einträgen "[" verwendet wird (kann ja in den Pfaden nicht mehr enthalten sein) - dabei fällt mir ein: Wenn der Pfad bis zum Startordner eine eckige Klammer enthält, wird auch jede dieser Klammern ersetzt - soll das so sein?
In weiterer Folge (Zeile 9) wird dann der String (ab Zeichen 2; Zeichen 1 ist immer "[") anhand der "[" in Array-Elemente gesplittet.
Grüße
bastla
"UBound(Arr)" liefert den höchsten Index des angegebenen Arrays.
Die beiden "Replace"-Vorgänge ersetzen sowohl "[" als auch "]" jeweils durch ein Leerzeichen - könntest Du natürlich auch auf zwei Zeilen aufteilen, etwa:
Pfad = Replace(SubFolder.Path, "[", " ")
DirEntries = DirEntries & "[" & Replace(Pfad, "]", " ")
Die gesamte Zeile (oder diese beiden Zeilen) sorgt/sorgen dafür, dass jeder Pfad dem Sammelstring "DirEntries" hinzugefügt wird, wobei als Trennzeichen zwischen den einzelnen Einträgen "[" verwendet wird (kann ja in den Pfaden nicht mehr enthalten sein) - dabei fällt mir ein: Wenn der Pfad bis zum Startordner eine eckige Klammer enthält, wird auch jede dieser Klammern ersetzt - soll das so sein?
In weiterer Folge (Zeile 9) wird dann der String (ab Zeichen 2; Zeichen 1 ist immer "[") anhand der "[" in Array-Elemente gesplittet.
Wieso muss VB auch so kryptisch sein? 
Das liegt wohl eher an meiner etwas "kompakteren" Schreibweise ...Grüße
bastla
Hallo TuXHunt3R!
Wenn Du Dateien bzw Ordner umbenennen willst, wozu dann das Array?
Grüße
bastla
... allerdings werden die Files nicht umbenannt.
Woran kann das liegen?
Unklare Formulierung der Aufgabenstellung? Du wolltest doch:Woran kann das liegen?
2. Bei allen diesen Pfäden, die sich dann in diesem Array befinden, die [ und ] durch Leerzeichen ersetzen.
Sollte das Script eigentlich gemacht haben - im Array (als Anleihe bei Biber: "works as designed").Wenn Du Dateien bzw Ordner umbenennen willst, wozu dann das Array?
Grüße
bastla
Hallo TuXHunt3R!
Falls das Umbenennen nicht möglich ist, da ein gleichnamiger Ordner / eine gleichnamige Datei bereits existiert, wird der Pfad mit vorangestelltem "##" (für Ordner) bzw "####" (für Datei) ohne Umwandlung der eckigen Klammern in das Array aufgenommen.
Grüße
bastla
Ordner = "D:\Test"
Set fso = CreateObject("Scripting.FileSystemObject")
Set Fld = fso.GetFolder(Ordner)
DirEntries = ""
DoFolders(Fld)
Arr = Split(Mid(DirEntries, 3), vbCrLF)
For i = 0 To UBound(Arr)
WScript.Echo i & vbTab & Arr(i)
Next
'Ende Hauptprogramm
Sub DoFolders(Folder)
For Each SubFolder In Folder.SubFolders
If InStr(SubFolder.Name, "]") Or InStr(SubFolder.Name, "[") Then
NewPath = Replace(Replace(SubFolder.Path, "]", " "), "[", " ")
If Not fso.FolderExists(NewPath) Then
NewName = Replace(Replace(SubFolder.Name, "]", " "), "[", " ")
SubFolder.Name = NewName
DirEntries = DirEntries & vbCrLF & SubFolder.Path
Else
DirEntries = DirEntries & vbCrLF & "##" & SubFolder.Path
End If
End If
DoFolders(SubFolder)
Next
For Each File In Folder.Files
If InStr(File.Name, "]") Or InStr(File.Name, "[") Then
NewPath = Replace(Replace(File.Path, "]", " "), "[", " ")
If Not fso.FileExists(NewPath) Then
NewName = Replace(Replace(File.Name, "]", " "), "[", " ")
File.Name = NewName
DirEntries = DirEntries & vbCrLF & File.Path
Else
DirEntries = DirEntries & vbCrLF & "####" & File.Path
End If
End If
Next
End Sub
Grüße
bastla
Hallo...
Habe noch eine Frage zu diesem Skript hier. Ist es auch möglich für die Dateisuche und umbenennung eine Variable zu verwenden???
Ich möchte, dass ein in der Inputbox eingegebener Name gesucht wird und das alle Dateien und Ordner mit diesem Namen umbenannt werden.
Es soll der alte Name in den neuen Namen umbenannt werden.
Wie müsste man das machen???
ich würde auch gerne das ganze erweitern, so dass auch alle Dateien im Verzeichnis eingelesen werden und der alte Name durch den neuen Namen in den Dateien ersetzt wird.
Um Hilfe wäre ich dankbar.
VG und Danke
Habe noch eine Frage zu diesem Skript hier. Ist es auch möglich für die Dateisuche und umbenennung eine Variable zu verwenden???
Ich möchte, dass ein in der Inputbox eingegebener Name gesucht wird und das alle Dateien und Ordner mit diesem Namen umbenannt werden.
Es soll der alte Name in den neuen Namen umbenannt werden.
Wie müsste man das machen???
ich würde auch gerne das ganze erweitern, so dass auch alle Dateien im Verzeichnis eingelesen werden und der alte Name durch den neuen Namen in den Dateien ersetzt wird.
Um Hilfe wäre ich dankbar.
VG und Danke