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

VBScript - In einem Ordner bei allen Unterordner und allen Dateinamen nach eckigen Klammern suchen und diese durch Leerzeichen ersetzen

Frage Entwicklung VB for Applications

Mitglied: TuXHunt3R

TuXHunt3R (Level 3) - Jetzt verbinden

24.06.2008, aktualisiert 01.07.2008, 15504 Aufrufe, 16 Kommentare

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
Mitglied: bastla
24.06.2008 um 22:38 Uhr
Hallo TuXHunt3R!

Der Ablauf ist zwar etwas anders, als von Dir beschrieben, das Ergebnis sollte aber wie gewünscht sein:
01.
Ordner = "D:\Test" 
02.
 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
Set Folder = fso.GetFolder(Ordner) 
05.
 
06.
For Each SubFolder In Folder.SubFolders 
07.
	If InStr(SubFolder.Name, "]") Or InStr(SubFolder.Name, "[") Then 
08.
		DirEntries = DirEntries & "[" & Replace(Replace(SubFolder.Name, "]", " "), "[", " ") 
09.
	End If 
10.
Next 
11.
 
12.
For Each File In Folder.Files 
13.
	If InStr(File.Name, "]") Or InStr(File.Name, "[") Then 
14.
		DirEntries = DirEntries & "[" & Replace(Replace(File.Name, "]", " "), "[", " ") 
15.
	End If 
16.
Next 
17.
 
18.
Arr = Split(Mid(DirEntries, 2), "[") 
19.
 
20.
For i = 0 To UBound(Arr) 
21.
	WScript.Echo i & vbTab & Arr(i) 
22.
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
01.
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 ).

Grüße
bastla
Bitte warten ..
Mitglied: TuXHunt3R
24.06.2008 um 22:55 Uhr
[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.
Bitte warten ..
Mitglied: bastla
24.06.2008 um 22:59 Uhr
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
Bitte warten ..
Mitglied: TuXHunt3R
24.06.2008 um 23:03 Uhr
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.
Bitte warten ..
Mitglied: TuXHunt3R
24.06.2008 um 23:07 Uhr
Wenn man den dir-Befehl brauchen könnte, wäre es einfacher. Dort würden die folgenden Befehle reichen, um alle betroffenen Files auszulesen:
01.
dir /s /b c:\test | find /i "[" >C:\log1.txt 
02.
dir /s /b C:\test | find /i "]" >C:\log2.txt
Geht halt bei VBScript nicht.....
Bitte warten ..
Mitglied: bastla
24.06.2008 um 23:08 Uhr
Geht halt bei VBScript nicht.....
Macht aber nix ...

Na dann:
01.
Ordner = "D:\Test" 
02.
 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
Set Fld = fso.GetFolder(Ordner) 
05.
 
06.
DirEntries = "" 
07.
DoFolders(Fld) 
08.
 
09.
Arr = Split(Mid(DirEntries, 2), "[") 
10.
 
11.
For i = 0 To UBound(Arr) 
12.
	WScript.Echo i & vbTab & Arr(i) 
13.
Next 
14.
'Ende Hauptprogramm 
15.
 
16.
Sub DoFolders(Folder) 
17.
For Each SubFolder In Folder.SubFolders 
18.
	If InStr(SubFolder.Name, "]") Or InStr(SubFolder.Name, "[") Then 
19.
		DirEntries = DirEntries & "[" & Replace(Replace(SubFolder.Path, "]", " "), "[", " ") 
20.
	End If 
21.
	DoFolders(SubFolder) 
22.
Next 
23.
 
24.
For Each File In Folder.Files 
25.
	If InStr(File.Name, "]") Or InStr(File.Name, "[") Then 
26.
		DirEntries = DirEntries & "[" & Replace(Replace(File.Path, "]", " "), "[", " ") 
27.
	End If 
28.
Next 
29.
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
Bitte warten ..
Mitglied: TuXHunt3R
24.06.2008 um 23:26 Uhr
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.
01.
DirEntries = DirEntries & "[" & Replace(Replace(SubFolder.Path, "]", " "), "[", " ") 
Edit:
Wieso muss VB auch so kryptisch sein?
Bitte warten ..
Mitglied: bastla
24.06.2008 um 23:37 Uhr
"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:
01.
Pfad = Replace(SubFolder.Path, "[", " ") 
02.
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
Bitte warten ..
Mitglied: TuXHunt3R
24.06.2008 um 23:40 Uhr
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.
Bitte warten ..
Mitglied: TuXHunt3R
25.06.2008 um 12:56 Uhr
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.
Bitte warten ..
Mitglied: bastla
25.06.2008 um 13:58 Uhr
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
Bitte warten ..
Mitglied: TuXHunt3R
25.06.2008 um 16:15 Uhr
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.
Bitte warten ..
Mitglied: bastla
25.06.2008 um 16:50 Uhr
Hallo TuXHunt3R!

01.
Ordner = "D:\Test" 
02.
 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
Set Fld = fso.GetFolder(Ordner) 
05.
 
06.
DirEntries = "" 
07.
DoFolders(Fld) 
08.
 
09.
Arr = Split(Mid(DirEntries, 3), vbCrLF) 
10.
 
11.
For i = 0 To UBound(Arr) 
12.
    WScript.Echo i & vbTab & Arr(i) 
13.
Next 
14.
'Ende Hauptprogramm 
15.
 
16.
Sub DoFolders(Folder) 
17.
For Each SubFolder In Folder.SubFolders 
18.
    If InStr(SubFolder.Name, "]") Or InStr(SubFolder.Name, "[") Then 
19.
        NewPath = Replace(Replace(SubFolder.Path, "]", " "), "[", " ") 
20.
        If Not fso.FolderExists(NewPath) Then 
21.
            NewName = Replace(Replace(SubFolder.Name, "]", " "), "[", " ") 
22.
            SubFolder.Name = NewName 
23.
            DirEntries = DirEntries & vbCrLF & SubFolder.Path 
24.
        Else 
25.
            DirEntries = DirEntries & vbCrLF & "##" & SubFolder.Path 
26.
        End If 
27.
    End If 
28.
    DoFolders(SubFolder) 
29.
Next 
30.
 
31.
For Each File In Folder.Files 
32.
    If InStr(File.Name, "]") Or InStr(File.Name, "[") Then 
33.
        NewPath = Replace(Replace(File.Path, "]", " "), "[", " ") 
34.
        If Not fso.FileExists(NewPath) Then 
35.
            NewName = Replace(Replace(File.Name, "]", " "), "[", " ") 
36.
            File.Name = NewName 
37.
            DirEntries = DirEntries & vbCrLF & File.Path 
38.
        Else 
39.
            DirEntries = DirEntries & vbCrLF & "####" & File.Path 
40.
        End If 
41.
    End If 
42.
Next 
43.
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
Bitte warten ..
Mitglied: TuXHunt3R
25.06.2008 um 20:51 Uhr
OK, danke.
Ich werde es testen.
Bitte warten ..
Mitglied: TuXHunt3R
01.07.2008 um 10:55 Uhr
Herzlichen Dank! Es funktioniert!

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

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Ordner inkl. Unterordner nach Dateien überprüfen (4)

Frage von belfry zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...