tuxhunt3r
Goto Top

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:

  1. Alle Unterordner und Dateinamen eines Verzeichnisses in ein eindimensionales Array einlesen, welche ein [ und/oder ein ] enthalten
  2. 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

Content-Key: 90571

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

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: bastla
bastla 24.06.2008 um 22:38:31 Uhr
Goto Top
Hallo TuXHunt3R!

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
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
cscript //nologo Script.vbs
aus einer CMD-Shell, da alle Array-Elemente am Ende zur Kontrolle ausgegeben werden (was mit einzelnen MsgBoxes etwas mühsam wird face-wink).

Grüße
bastla
Mitglied: TuXHunt3R
TuXHunt3R 24.06.2008 um 22:55:31 Uhr
Goto Top
[EDIT]
In dieser Fassung wird nicht rekursiv gearbeitet, es werden nur die Dateien und Unterordner des angegebenen Ordners erfasst.

Was genau meinst du damit? Werden nicht bei allen Unterordnern (egal wie viele Ebenen) und allen Dateien (egal auf welcher Ebene, d.h. unterhalb des angegenenen Ordners) die Dateien umbenannt? Wenn nein, wie müsste eine Lösung dann aussehen? Es müssten wirklich unterhalb des angegebenen Ordners auf beliebig vielen Ebenen alle Ordner und Dateien umbenannt werden.

[/EDIT]

[EDIT2]
Rekursiv: Ja
[/EDIT2]

Zum Testen habe ich den Ordner einfach eingetragen (Du hast ja auch nichts über die Art des Aufrufes geschrieben).
Das krieg ich selber hin, darum habe ich es nicht geschrieben. Aber danke.

Starten solltest Du über cscript //nologo Script.vbs aus einer CMD-Shell, da alle Array-Elemente am Ende zur Kontrolle ausgegeben werden (was mit einzelnen MsgBoxes etwas mühsam wird ).
Mache ich sowieso immer. Die CScript.exe ist bei allen Clients, auf denen das Script ausgeführt werden soll, als Standard-Skripthost gesetzt.
Mitglied: bastla
bastla 24.06.2008 um 22:59:13 Uhr
Goto Top
Hallo TuXHunt3R!

Wolltest Du das Ganze übrigens rekursiv (war der Anforderung nicht zu entnehmen)?

Weitere Frage: Eigentlich hattest Du "Pfäde" geschrieben - dafür dann einfach ".Name" durch ".Path" ersetzen.

Grüße
bastla
Mitglied: TuXHunt3R
TuXHunt3R 24.06.2008 um 23:03:26 Uhr
Goto Top
Wolltest Du das Ganze übrigens rekursiv (war der Anforderung nicht zu entnehmen)?
Siehe editierte Antwort oben

Weitere Frage: Eigentlich hattest Du "Pfäde" geschrieben - dafür dann einfach ".Name" durch ".Path" ersetzen.
So wäre es gedacht gewesen, ist mir im Moment gar nicht aufgefallen. Naja, das hätte ich dann auch noch selbst hingekriegt.
Mitglied: TuXHunt3R
TuXHunt3R 24.06.2008 um 23:07:36 Uhr
Goto Top
Wenn man den dir-Befehl brauchen könnte, wäre es einfacher. Dort würden die folgenden Befehle reichen, um alle betroffenen Files auszulesen:
dir /s /b c:\test | find /i "[" >C:\log1.txt  
dir /s /b C:\test | find /i "]" >C:\log2.txt  

Geht halt bei VBScript nicht.....
Mitglied: bastla
bastla 24.06.2008 um 23:08:17 Uhr
Goto Top
Geht halt bei VBScript nicht.....
Macht aber nix ... face-wink

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
Auch wenn Pfade im Array stehen sollen, habe ich die Überprüfung auf "[" oder "]" aber trotzdem anhand des Namens durchgeführt, da ansonsten alle Dateien in einem Ordner mit zB "[" im Namen ebenfalls aufgelistet würden (was auch bei der skizzierten Batchvariante der Fall wäre).

Grüße
bastla
Mitglied: TuXHunt3R
TuXHunt3R 24.06.2008 um 23:26:47 Uhr
Goto Top
Das ist das, was ich brauche. Danke.

Noch ein paar Fragen zum Verständnis:
- Was macht "DoFolders"?
- Was ist "UBound"?
- Kannst du die folgende Zeile etwas genauer aufschlüsseln? Ich verstehe nicht genau, wieso du 2x "Replace" drin hast.
DirEntries = DirEntries & "[" & Replace(Replace(SubFolder.Path, "]", " "), "[", " ")   

Edit:
Wieso muss VB auch so kryptisch sein? face-smile
Mitglied: bastla
bastla 24.06.2008 um 23:37:11 Uhr
Goto Top
"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:
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? face-wink
Das liegt wohl eher an meiner etwas "kompakteren" Schreibweise ...

Grüße
bastla
Mitglied: TuXHunt3R
TuXHunt3R 24.06.2008 um 23:40:59 Uhr
Goto Top
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?

Das Script wird auf diversen PCs bei den lokalen Profilordnern laufen gelassen, also unter C:\Users\%username%. Dort hat es mit Garantie keine eckigen Klammern, das ist also kein Problem.

OK, werde es testen und gebe dir dann Feedback.
Mitglied: TuXHunt3R
TuXHunt3R 25.06.2008 um 12:56:34 Uhr
Goto Top
Sooo, ich habs nun getestet und es funktioniert nicht. Das Script liefert zwar eine schönen Liste mit allen Files und Folders, die es angeblich umbenannt hat, allerdings werden die Files nicht umbenannt.

Woran kann das liegen?

PS: Ich verwende Vista, es funktioniert aber auch unter Windows 2000 nicht. Ich habe es mit einem UNC- und einem normalen Pfad versucht.
Mitglied: bastla
bastla 25.06.2008 um 13:58:29 Uhr
Goto Top
Hallo TuXHunt3R!

... allerdings werden die Files nicht umbenannt.
Woran kann das liegen?
Unklare Formulierung der Aufgabenstellung? Du wolltest doch:
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
Mitglied: TuXHunt3R
TuXHunt3R 25.06.2008 um 16:15:24 Uhr
Goto Top
Tja, das ist dann wohl mein Fehler. Um deine Frage zu beantworten: Ja, es soll die Files auch wirklich umbenennen und nicht nur die Array-Einträge umbenennen.
Mitglied: bastla
bastla 25.06.2008 um 16:50:24 Uhr
Goto Top
Hallo TuXHunt3R!

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
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
Mitglied: TuXHunt3R
TuXHunt3R 25.06.2008 um 20:51:26 Uhr
Goto Top
OK, danke.
Ich werde es testen.
Mitglied: TuXHunt3R
TuXHunt3R 01.07.2008 um 10:55:34 Uhr
Goto Top
Herzlichen Dank! Es funktioniert!

Habe das Script noch firmenintern angepasst und mit einige Zusatzfunktionen versehen, darum hats mit der Antwort etwas gedauert...
Mitglied: Agentbob
Agentbob 10.11.2014 aktualisiert um 21:13:06 Uhr
Goto Top
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