Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: TuXHunt3R

TuXHunt3R (Level 3) - Jetzt verbinden

24.06.2008, aktualisiert 01.07.2008, 17451 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 ..
Ähnliche Inhalte
Microsoft

Suche und Ersetzen im Dateinamen mit Wildcard?

gelöst Frage von GottfriedKernMicrosoft5 Kommentare

Ich suche ein Programm, dass Dateinamen durchsucht und mittels Platzhalter ersetzen kann. Beispiel: toller - sound (2002).mp3 soll in ...

Batch & Shell

Mit Powershell Daten löschen, die eckige Klammern im Namen haben

gelöst Frage von arduinoBatch & Shell2 Kommentare

Moin Eckige Klammern werden als Wildcards verwendet. Wie kann ich Powershell beibringen, dass es diese als normale Dateien behandelt? ...

Batch & Shell

Batch Variable erzeugen mit Leerzeichen und Klammern

gelöst Frage von hipfzwirgelBatch & Shell11 Kommentare

Hallo an Alle, ich habe eine lösbare Aufgabe und finde die richtige Schreibweise nicht. Ich muss eine Variable in ...

Batch & Shell

Powershell: Dateien suchen, Ordner, Unterordner

gelöst Frage von internet2107Batch & Shell5 Kommentare

Hallo und guten Morgen. Leider habe ich noch einen Teil 2, den ich irgendwie nicht gelöste bekomme. Dank colinardo ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 5 StundenWindows 102 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 7 StundenAdministrator.de Feedback10 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 1 TagHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 1 TagGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Server-Hardware
Welche Rolle spielt Design bei Enterprise IT Hardware?
Frage von ApolloXServer-Hardware17 Kommentare

Ich arbeite für einen internationalen Elektronikhersteller in der Forschung und meine Aufgabe ist es, Feedback von Nutzern in Hinsicht ...

Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Switche und Hubs
Cisco SG350X-48 AdminIP in anderes VLAN
Frage von lcer00Switche und Hubs14 Kommentare

Hallo zusammen, ich habe ein Problem mir einem Cisco SG350X-48 bei der Erstinstallation wurde eine IP 192.168.0.254 (Default VLAN ...