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

Leere Ordner, die ein bestimmtes Wort NICHT beinhalten, verschieben bzw. löschen

Frage Entwicklung Batch & Shell

Mitglied: Clubnite

Clubnite (Level 1) - Jetzt verbinden

27.12.2007, aktualisiert 02.01.2008, 6735 Aufrufe, 17 Kommentare

hallo,

ich stehe vor einem problem, für das ich selbst keine lösung finden kann. ich hab eine größere Menge von Ordnern, in denen sich dateien und auch immer eine prüfsummendatei befinden, über einen server auf eine andere platte verschoben. der server hat dabei per script die prüfsummen verglichen und nur diejenigen dateien durchgelassen, die den check bestanden haben. wenn ein ordnerinhalt den test nicht bestand, wurde der ordner jedoch auf der neuen platte erstellt und ist nun entweder leer oder beinhaltet dateien, die nicht in der prüfsumme enthalten sind. vollständige ordner wurden auf der zielplatte mit einem zusätzlichen "header"-ordner versehen, der im namen zusätzlich das wort "complete" beinhaltet.

ich suche jetzt nach einer möglichkeit, über der zielplatte mit einem script zu iterieren und alle ordner, die leer sind und nicht das wort "complete" oder "incomplete" beinhalten, in einen sammelordner zu verschieben, um das löschen manuell vorzunehmen und so nochmal eine letzte sicherheitsschranke gegen versehentliches löschen falscher ordner einzubauen.

ich suche nun schon tagelang nach einem guten tut für ein batch-script oder vbs. aber ich komme nicht voran, weil ich bislang programmiertechnisch nur über dateien iteriert habe und die syntax der batch scripte nicht so wirklich verstehe. zwar gibt es den befehl if exist und die option des stringvergleiches, aber irgendwie krieg ich das nicht so zusammengebaut, dass die ordnernamen darauf geprüft werden, ob sie diese begriffe nicht enthalten.

hat vielleicht jemand eine idee, wie man da rangehen könnte oder gar schonmal sowas geschrieben?

ich wäre wirklich super dankbar für hilfe.

mfg

clubnite
Mitglied: TuXHunt3R
27.12.2007 um 20:41 Uhr
Hier ein Entwurf in Batch (nicht getestet und ohne Kosmetik):

01.
@echo off 
02.
 
03.
::Eventuell existierende Logfiles ins Jenseits befördern 
04.
if exist %systemroot%\temp\delbatch ( 
05.
rmdir /s /q %systemroot%\temp\delbatch 
06.
07.
 
08.
::Ordner für Logfiles erstellen 
09.
mkdir %systemroot%\temp\delbatch 
10.
 
11.
:: Alle Ordner herausfiltern, die das Wort "Complete" nicht enthalten 
12.
dir <Pfad zu deinem Ordner> /s /b /a:d | find /v /i "complete" >%systemroot%\temp\delbatch\step1.txt 
13.
 
14.
::Aus dem 2. Logfile alle Ordner herausfiltern, die das Wort "Incomplete" nicht enthalten 
15.
dir <Pfad zu deinem Ordner> /s /b /a:d | find /v /i "incomplete" >%systemroot%\temp\delbatch\step2.txt 
16.
 
17.
::Jeden Ordner auf der Liste "step2.txt" löschen 
18.
for /f %%a IN (%systemroot%\temp\delbatch\step2.txt) DO rmdir /s /q "%%a" 
19.
 
Sollte eigentlich laufen. Melde dich auf jeden Fall, egal ob es geklappt hat oder nicht.

Edit:
"<Pfad zu deinem Ordner>" musst du natürlich noch mit dem entsprechenden Pfad ersetzen
Bitte warten ..
Mitglied: Clubnite
27.12.2007 um 23:41 Uhr
hi,

danke schonmal für deine antwort. wo ist in deinem entwurf die berücksichtigung der leeren ordner implementiert? ich meine, ich lese nichts von einem vergleich der art "is empty". vielleicht liegts an meinem fehlenden verständnis des batch scripting. so wie ich das script lese, listet es ALLE ordner in einer .txt und vergleicht dann alle zeilen erst mit dem string Complete und nachher mit dem string Incomplete. das heißt, alle übergeordneten ordner kommen dabei auch in frage. hier mal ein kleines skribble, wie die verzeichnis struktur ist.

Drive:\
-=[A]=-\
[ Arm ]\
[ Arm 001 ] Neuer Ordner_Neuer Ordner 1\[ ... complete ... ] , 00.sfv , 01.datei , 02.datei
[ Arm 002 ] Neuer Ordner_Neuer Ordner 2\[ ... incomplete ... ] , 00.jpg , 01.missing, 02.missing, 03.datei

-=[B]=-\
[ Beutelsuppe ]\
[ BS 01 ] Neuer Ordner_Neuer Ordner 1\[ ... complete ... ] , 00.sfv , 01.datei , 02.datei
[ BS 02 ] Neuer Ordner_Neuer Ordner 2\[ ... incomplete ... ] , 00.jpg , 01.missing, 02.datei

die verteilung der complete und incomplete header soll hier nur beispielhaft sein. in der tat ist die verteilung abhängig von der vollständigkeit der ordner, welche sich wie gesagt, aus der prüfsumme ergibt. mir geht es nun darum, alle ordner der 3. ebene (also z.B. [ Arm 001 ] Neuer Ordner_Neuer Ordner 1) zu finden die leer sind und keinen header-ordner, mit namen complete oder incomplete beinhalten, zu finden. die vorhandenen header-ordner befinden sich in ordnern, die ok sind und sollen da auch bleiben. sie werden jedoch erst garnicht erstellt, wenn der inhalt des elternordners die prüfsumme nicht besteht. der elternordner selber wird jedoch leider erstellt.

ich hoffe, das problem ist klar, denn ich hab das gefühl, es umständlich zu beschreiben. nach meinem bisherigen eindruck, würde das script direkt schon die ordner -=[A]=-, [ Arm ] , [ Arm 001 ] Neuer Ordner_Neuer Ordner 1 listen und löschen, weil sie weder "complete" noch "incomplete" beinhalten. korrigier mich, wenn ich falsch liege.

ich hatte so eine ähnliche idee, jedoch weiß ich nicht, wie man innerhalb einer .txt datei vergleichen kann, ob ein ordner komplett leer ist oder z.b. .jpg oder .doc files enthält und somit auch einen header - ob nun incomplete oder complete, sei mal dahin gestellt. lässt sich das denn realisieren?
Bitte warten ..
Mitglied: bastla
28.12.2007 um 01:44 Uhr
Hallo Clubnite und willkommen im Forum!

Eine VBS-Variante mit einem kleinen Schönheitsfehler sähe etwa so aus:
01.
' MoveEmptyFoldersAccordingToPartOfName.vbs 
02.
 
03.
Const BaseFolder = "D:\Test\"	' immer abschließenden "\" verwenden 
04.
Const MoveTo = "E:\Temp"	' nie abschließenden "\" verwenden 
05.
Const CheckFor = "complete"	' "incomplete" wird, da "complete" enthaltend, damit auch gefunden 
06.
 
07.
L = Len(BaseFolder) 
08.
 
09.
Set fso = CreateObject("Scripting.FilesystemObject") 
10.
If fso.FolderExists(BaseFolder) Then 
11.
	If Not fso.FolderExists(MoveTo) Then 
12.
		fso.CreateFolder(MoveTo) 
13.
	End If 
14.
    DoFolders fso.GetFolder(BaseFolder) 
15.
Else 
16.
    WScript.Echo "Startordner " & BaseFolder & " nicht gefunden!" 
17.
    WScript.Quit(1) 
18.
End If 
19.
WScript.Echo "Fertig." 
20.
 
21.
Sub DoFolders(Folder) 
22.
For Each SubFolder In Folder.SubFolders 
23.
    DoFolders SubFolder 
24.
    ' Auf der untersten Verzeichnisebene beginnen, um auch erst durch 
25.
    ' das Script geleerte Verzeichnisse berücksichtigen zu können 
26.
    If (SubFolder.SubFolders.Count + SubFolder.Files.Count) = 0 Then 
27.
        If InStr(LCase(SubFolder.Name), CheckFor) = 0 Then 
28.
            MoveFolder SubFolder.Path 
29.
        End If 
30.
    End If 
31.
Next 
32.
End Sub 
33.
 
34.
Sub MoveFolder(SourcePath) 
35.
RelPath = Mid(SourcePath, L + 1) ' Relativer Pfad unterhalb von "BaseFolder" 
36.
Tree = Split(RelPath, "\") 
37.
TargetPath = MoveTo 
38.
' Verzeichnisstruktur unterhalb von "MoveTo" schrittweise erstellen 
39.
For i = 0 To UBound(Tree) 
40.
    TargetPath = TargetPath & "\" & Tree(i) 
41.
    If Not fso.FolderExists(TargetPath) Then fso.CreateFolder(TargetPath) 
42.
Next 
43.
fso.DeleteFolder SourcePath 
44.
 
45.
WScript.Echo SourcePath & ";" & TargetPath 
46.
End Sub
Der angesprochene Schönheitsfehler besteht darin, dass das Verschieben des Verzeichnisses durch das Anlegen eines neuen Verzeichnispfades im Zielverzeichnis und anschließendes Löschen des Originalverzeichnisses nur simuliert wird.

Begründung dafür: Einerseits muss (im Gegensatz zu einer Batch-Version) in VBS ohnehin der Pfad schrittweise (Unterverzeichnis für Unterverzeichnis) erstellt werden, andererseits scheint (für mich überraschend) ein Verschieben von Verzeichnissen auf eine andere Partition (zumindest unter XP und WSH 5.6) per VBS nicht möglich.

Gedacht ist das Script für eine Verwendung von der Kommandozeile, zB
01.
cscript //nologo "C:\Scripts\MoveEmptyFoldersAccordingToPartOfName.vbs"
damit die jeweils "verschobenen" Verzeichnisse durch die "WScript.Echo"-Zeile vernünftig (im Sinne von "nicht als einzeln wegzuklickende MsgBoxes") ausgegeben werden können. Mit einem zusätzlichen "> Log.txt" lässt sich diese Ausgabe natürlich auch in eine Textdatei umleiten.

Grüße
bastla
Bitte warten ..
Mitglied: TuXHunt3R
28.12.2007 um 13:23 Uhr
Stimmt, hatte ich nicht berücksichtigt, sorry. Werds mir heute Abend aber nochmals ansehen.
Bitte warten ..
Mitglied: Biber
29.12.2007 um 00:38 Uhr
Moin Clubnite,

willkommen im Forum auch von mir.
Dann will ich auch noch eine CMD-Prompt-Variante beisteuern.

Anders als in bastlas Ansatz möchte ich aber auf die Rekursivität (unbekannte/beliebige Anzahl Verzeichnisebenen) verzichten und von einer festgelegten Anzahl Ebenen ausgehen.
Nicht weil es am CMD-Prompt nicht rekursiv ginge, sondern weil es unnötige Komplexität in dieses banale Problem hineinbrächte.

Wenn wir von einer konstanten Anzahl Unterebenen ausgehen (meinetwegen 3, die uns gleich wieder wieder als %a, %b und %c begegnen) dann sollte es wie im folgenden Beispiel gehen.

Gegeben sei folgende Verzeichnis/Dateistruktur (erst alles, dann nur DIRs, dann nur FILEs):
01.
Z:\> 
02.
$cmd$dir Beutelsuppe /b /s 
03.
Z:\Beutelsuppe\BS 01 
04.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1 
05.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2 
06.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3 
07.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4 
08.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1\somewhat.tmp 
09.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3\this is complete 
10.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3\this is complete\01.jpg 
11.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\this is incomplete 
12.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\anyFile.tmp 
13.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\this is incomplete\00.sfv 
14.
 
15.
Z:\> 
16.
$cmd$dir Beutelsuppe /b /s /a:d 
17.
Z:\Beutelsuppe\BS 01 
18.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1 
19.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2 
20.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3 
21.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4 
22.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3\this is complete 
23.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\this is incomplete 
24.
 
25.
Z:\> 
26.
$cmd$dir Beutelsuppe /b /s /a:-d 
27.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1\somewhat.tmp 
28.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3\this is complete\01.jpg 
29.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\anyFile.tmp 
30.
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\this is incomplete\00.sfv
...dann sollten, wenn ich es richtig gelesen habe, die Unterordner "Neuer_Ordner...3" und "Neuer_Ordner...4" als OKAY gelten.
Denn diese enthalten einen Unterordner mit dem Signalwort "complete".
Ordner "..1" und "...2" könnten/müssten verschoben werden.
Hier kann noch differenziert/verfeinert werden: Ordner "..1" enthält eine Datei, Ordner "...2" ist vollkommen leer.

Tasten wir uns ran mit 3 Ebenen (%a %b %c) am CMD-Prompt:
01.
$cmd$for /d %a in (z:\Beutelsuppe\*) do @for /d %b in ("%a\*") do @for /d %c in ("%b") do @if not exist "%b\*complete*" @echo %c 
02.
"z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1" 
03.
"z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2"
So bekäme ich alle "dritten" Verzeichnisebenen, die KEINEN Subfolder "*complete*" enthalten.

Wenn zusätzlich keine Datei darin sei darf, dann können wir das testen, weil sich beide beim "Dir /s /b" unterschiedlich verhaltnn
[Exkurs]
01.
$cmd$dir "z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2\" /b /s 
02.
 
03.
$cmd$dir "z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1\" /b /s 
04.
z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1\somewhat.tmp
Wenn wir die untere Ausgabe (Ordner "...1") noch mal durch den Find-Befehl jagen und nach dem Verzeichnisnamen suchen lassen, wird etwas gefunden.
Bei Ordner "..2", der weder Dateien enthält noch Unterordner wird nichts gefunden.
Also ändern wir die rechte Tu-Was-Seite der Zeile auf
...$cmd$....@if not exist "%b\*complete*" @dir "%b\*.*" /s/b|find /i "%b">nul || @echo %b
01.
$cmd$for /d %a in (z:\Beutelsuppe\*) do @for /d %b in ("%a\*") do @for /d %c in ("%b") do @if not exist "%b\*complete*" @dir "%b\*.*" /s/b|find /i "%b">nul || @echo %b 
02.
z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2
Gut, der Rest ist einfach. Der Arbeits-Teil, der bisher aus
....@echo %b"
für das gefundene Verzeichnis besteht, kann ersetzt werden durch ein ...
01.
 ...md "y:\sicherheitskopie\%~pnxb" && rd "%b"
...wenn das LEERE Verzeichnis "%b" als Merkposten angelegt werden soll vor dem Löschen
-oder-
01.
 ..md "y:\sicherheitskopie\%~pnxb" && xcopy /s /e "%b\*.*" "y:\sicherheitskopie\%~pnxb" && rd "%b"
...wenn ein halbvolles Verzeichnis verschoben werden soll.

So oder so sollte es mit einem Oneliner vom CMD-Prompt gehen, auch für mehrere Startverzeichnisse:
01.
$cmd$for /d %a in (d:\temp\arm\* z:\Beutelsuppe\*) do @for /d %b in ("%a\*") do @for /d %c in ("%b") do @if not exist "%b\*complete*" @echo %c 
02.
"d:\temp\arm\Arm 001\Neuer Ordner_Neuer Ordner 1" 
03.
"d:\temp\arm\Arm 001\Neuer Ordner_Neuer Ordner 2" 
04.
"z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1" 
05.
"z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2"
Grüße
Biber
Bitte warten ..
Mitglied: Clubnite
29.12.2007 um 12:16 Uhr
WOW!!! jungs, mit so viel guter hilfe hätte ich im ernst nicht gerechnet sondern eher nur hinweise auf lernquellen wie in manch anderen foren. ich möchte mich für euren mühen an dieser stelle erst einmal herzlich bedanken! *DANKE*

bestünde denn die möglichkeit, mir eine online referenz auf batch scripting zu empfehlen, die vielleicht genauso gut erläutert wie du, biber? wenn ich nach batch programming oder batch tutorial google, werde ich nicht fündig. ich möchte aber gern mal so gut "batchen" können, dass ich sowas künftig alleine schreiben kann. zwar konnte ich bei wikibook einiges finden, aber die erläuterungen speziell zu den verwendeten schaltern und parametern sind nicht sonderlich ergibig, so dass ich auch beim verstehen deines scriptes, biber, noch probleme habe und für eventuelle anpassungen wieder nachfragen müsste. mir fiel nämlich beim aufräumen auf, dass ich noch viele ordner, der struktur [ Cat.No ] WANT habe, die leer sind. die sollen natürlich als platzhalter bestehen bleiben.

ich muss eure beiden varianten erstmal durchtesten. dazu bin ich gestern leider nicht gekommen, weshalb ich bislang eine reaktion noch schuldig bleiben musste. ich werde das also jetzt direkt mal testen

grüße, clubnite
Bitte warten ..
Mitglied: Clubnite
29.12.2007 um 17:33 Uhr
also @bastla,

dein script läuft soweit prima. würde gern noch einige kleinigkeiten implementieren, wenn möglich. ist es möglich, den quellpfad zu verketten? sprich, wenn sich auf meiner platte neben der reihe "I:\-=[ A ]=-\" bis "I:\-=[ Z ]=-\" noch ganz andere ordner befinden, wie kann ich den quellpfad auf A bis Z einschränken? ich möchte dabei jedoch nicht erst alle ordner verschieben, da dies bedeutete, +300GB zu verschieben. ich dachte dabei an eine schleifen-lösung. ich könnts grad nur in java schreiben.

String[] letter = {A,B,C, ... ,X,Y,Z};

for (i=0; 0<letter.length;i++) {

"I:\-=[ i ]=-\" // ist nur Pseudocode ;)
}

und so dann die Letter in "I:\-=[ ]=-\" durchzählen. ginge das irgendwie in vbs?

und könntest du neben complete und incomplete noch "WANT" excluden? ich wüsste auch hier nur wieder die lösung per stringvergleich in java. aber das würde bedeuten, erst jeden ordnernamen einzulesen, in einer variablen zu puffern und mit den 3 strings zu vergleichen und bei mismatch entsprechend zu verschieben.

wäre es möglich, das noch implementieren?

@Biber,

deine variante probiere ich grad noch

gruß, clubnite
Bitte warten ..
Mitglied: bastla
29.12.2007 um 18:01 Uhr
Hallo Clubnite!

Kurz zum Thema "Verschieben": Wenn Du nur innerhalb einer Partition verschiebst, sollte die Datenmenge eigentlich nicht relevant sein, da ja nur die Pointer auf die jeweiligen Ordner der obersten Ebene geändert werden müssen.
Soferne ich Dich richtig verstehe, sind mit "I:\-=[ A ]=-\" bis "I:\-=[ Z ]=-\" nur Ordner im Rootverzeichnis zu berücksichtigen, sodass also der jeweilige Ordner als "BaseFolder" im Script gelten kann. Das sähe dann etwa so aus:
01.
' MoveEmptyFoldersAccordingToPartOfNameExtended.vbs 
02.
 
03.
Const MoveTo = "E:\Temp"	' nie abschließenden "\" verwenden 
04.
 
05.
' Verzeichnisse mit diesen Wörtern (Angabe in Kleinschreibung) im Namen nicht bearbeiten 
06.
' "incomplete" wird durch "complete" automatisch berücksichtigt 
07.
Exclude = Array("complete", "want")  
08.
 
09.
 
10.
Set fso = CreateObject("Scripting.FilesystemObject") 
11.
If Not fso.FolderExists(MoveTo) Then 
12.
	fso.CreateFolder(MoveTo) 
13.
End If 
14.
 
15.
' Alle Verzeichnisse "I:\-=[ A ]=-\" bis "I:\-=[ Z ]=-\" als "BaseFolder" verwenden 
16.
For i = Asc("A") To Asc("Z") 
17.
 
18.
	' Name des Verzeichnisses wird hier erstellt 
19.
	BaseFolder = "I:\-=[" & Chr(i) & "]=-\" 
20.
 
21.
	' L = Len(BaseFolder) 
22.
	L = 3 ' nur "I:\" bei der Ermittlung des relativen Pfades abschneiden, 
23.
	      ' da ev mehrere gleichnamige Unterverzeichnisse in den einzelnen 
24.
	      ' "I:\-=[ x ]=-\"-Verzeichnissen existieren und es damit zu Kollisionen 
25.
	      ' beim "Verschiebe"-Ziel kommen könnte. 
26.
	 
27.
	If fso.FolderExists(BaseFolder) Then 
28.
		WScript.Echo "Bearbeite " & BaseFolder 
29.
		DoFolders fso.GetFolder(BaseFolder) 
30.
	Else 
31.
		WScript.Echo "Ordner " & BaseFolder & " nicht gefunden!" 
32.
	End If 
33.
Next 
34.
WScript.Echo "Fertig." 
35.
 
36.
Sub DoFolders(Folder) 
37.
For Each SubFolder In Folder.SubFolders 
38.
    DoFolders SubFolder 
39.
    ' Auf der untersten Verzeichnisebene beginnen, um auch erst durch 
40.
    ' das Script geleerte Verzeichnisse berücksichtigen zu können 
41.
	 
42.
    'Ist Verzeichnis leer? 
43.
    If (SubFolder.SubFolders.Count + SubFolder.Files.Count) = 0 Then 
44.
		DoIt = True 
45.
		' Ist ein vorgegebenes Wort im Verzeichnisnamen enthalten? 
46.
		For Each Word In Exclude 
47.
			If InStr(LCase(SubFolder.Name), Word) > 0 Then 
48.
				DoIt = False 
49.
				Exit For 
50.
			End If 
51.
		Next 
52.
	End If 
53.
 
54.
	If DoIt Then ' Keines der vorgegebenen Wörter im Namen gefunden 
55.
		MoveFolder SubFolder.Path 
56.
	End If 
57.
Next 
58.
End Sub 
59.
 
60.
Sub MoveFolder(SourcePath) 
61.
RelPath = Mid(SourcePath, L + 1) ' Relativer Pfad unterhalb von "BaseFolder" 
62.
Tree = Split(RelPath, "\") 
63.
TargetPath = MoveTo 
64.
' Verzeichnisstruktur unterhalb von "MoveTo" schrittweise erstellen 
65.
For i = 0 To UBound(Tree) 
66.
    TargetPath = TargetPath & "\" & Tree(i) 
67.
    If Not fso.FolderExists(TargetPath) Then fso.CreateFolder(TargetPath) 
68.
Next 
69.
fso.DeleteFolder SourcePath 
70.
 
71.
WScript.Echo SourcePath & ";" & TargetPath 
72.
End Sub
Das Script ist in dieser Version noch ungetestet.

Grüße
bastla
Bitte warten ..
Mitglied: Clubnite
30.12.2007 um 17:20 Uhr
hi bastla,

programm läuft grundsätzlich.... allerdings werden verzeichnisse mit nicht verwendeten sonderzeichen im root gesucht wie z.B. -=[ @ ]=- und -=[ ! ]=- usw. das kann raus. das größere problem ist aber dass die schleife nicht verlassen wird. die suche beginnt nach den sonderzeichen wieder bei A...

trotzdem nochmal ein dickes lob und DANKE für deine mühe!

gruß, clubnite
Bitte warten ..
Mitglied: bastla
30.12.2007 um 18:31 Uhr
Hallo Clubnite!

allerdings werden verzeichnisse mit nicht verwendeten sonderzeichen im root gesucht wie z.B. -=[ @ ]=- und -=[ ! ]=- usw.
Soferne Du keine Änderungen an den Zeilen
01.
For i = Asc("A") To Asc("Z")
bzw
01.
BaseFolder = "I:\-=[" & Chr(i) & "]=-\"
vorgenommen hast, ist dieses Verhalten nicht nachvollziehbar.

Auch, dass die Schleife nicht enden sollte, ist mir auf Basis der von mir geposteten Version, welche ich soeben in dieser Hinsicht kurz getestet habe, nicht erklärlich.

Grüße
bastla
Bitte warten ..
Mitglied: Clubnite
30.12.2007 um 19:13 Uhr
hallo bastla,

ich habe in der tat eine anpassung an der stelle --> BaseFolder = "I:\-=[ " & Chr(i) & " ]=-\" vornehmen müssen, weil ein problem auftrag in der Form, dass nach -=[A]=- gesucht wurde, was jedoch nicht vorhanden ist, weil das folder -=[ A ]=- heißt, mit 2 blanks vorher und nachher. hätte allerdings nicht erwartet, dass dies der auslöser sei. liegt wohl daran, dass ich von vbs nach wie vor keinen plan hab. sieh's mir nach! ;)

wie soll ich nun vorgehen?
Bitte warten ..
Mitglied: bastla
30.12.2007 um 21:56 Uhr
Hallo Clubnite!

War mein Fehler, dass ich die Blanks nicht berücksichtigt hatte ...

... und noch mehr, dass ich nicht bedacht hatte, dass Variable in VBS grundsätzlich global verwendet werden.

Ändere daher bitte in den beiden genannten Zeilen die Schleifenvariable "i" auf zB "Letter", also:
01.
For Letter = Asc("A") To Asc("Z") 
02.
... 
03.
BaseFolder = "I:\-=[ " & Chr(Letter) & " ]=-\" 
04.
...
Grüße
bastla

[Edit]
Fehlerursache "globale Variablenverwendung" gefunden.

Mein oben angesprochener "Kurztest" hatte sich nur auf die oberste Ordnerebene und deren Namenskonventionen bezogen und kein tatsächliches "Verschieben" beinhaltet - daher war mir nicht aufgefallen, dass im "Sub MoveFolder" die ursprünglich im Hauptprogramm verwendete Schleifenvariable "i" einen neuen Wert erhält.
[/Edit]
Bitte warten ..
Mitglied: Clubnite
01.01.2008 um 16:49 Uhr
hallo bastla,

dir und den anderen lesern erstmal ein frohes neues jahr!

nun zum script. dieses hatte noch immer probleme mit den verzeichnissen. du hast diese stelle BaseFolder = "I:\-=[ " & Chr(Letter) & " ]=-\" nur um einen space pro seite erweitert. ich hab es nochmals um jeweils einen weiteren space angepasst und jetzt läuft es prima! nochmals ein dickes lob und dankeschön für deine freiwillige arbeit!

besteht die motivation, das script noch ein wenig auszudehen oder anhand der jetzigen konstellation eine modifikation in die richtung vorzunehmen, per interaktion nach ordnern zu suchen, die nur einen vom nutzer vorgebbaren typ datei beinhalten - z.b. alle ordner, die nur .txt dateien enthalten finden oder alle, die nur .jpg dateien enthalten. die jeweilige endung könnte dann per abfrage eingeholt und entsprechend übergeben werden.

wäre es aufwendig, die verschobenen im Temp-ordner lagernden ordner vielleicht mit einem anderen script der art zu handlen, dass man den aktuellen namen einliest, z.b. [ 001 ] Neuer Ordner_Neuer Ordner 1 und alles rechtsseitig des chars ] gegen den string WANT ersetzt, sodass der bsp. ordner dann [ 001 ] WANT heißt?

möchte deine hilfe nicht wirklich überstrapazieren. wenn das zu aufwändig und deine motivation beschränkt ist, wäre das ok.

gruß, clubnite
Bitte warten ..
Mitglied: bastla
01.01.2008 um 18:53 Uhr
Hallo Clubnite!

du hast diese stelle BaseFolder = "I:\-=[ " & Chr(Letter) & " ]=-\" nur um einen space pro seite erweitert. ich hab es nochmals um jeweils einen weiteren space angepasst ...
In diesem Zusammenhang möchte ich Dich auf die Möglichkeit, nicht nur Programmcode, sondern etwa auch Daten, bei denen es, so wie hier, auf einzelne Zeichen ankommt, der besseren Lesbarkeit wegen unter < code>-Tags (ohne das Leerzeichen) zu setzen, also etwa
01.
I:\-=[  A  ]=-\
wäre es aufwendig, die verschobenen im Temp-ordner lagernden ordner vielleicht mit einem anderen script der art zu handlen, dass man den aktuellen namen einliest, z.b. [ 001 ] Neuer Ordner_Neuer Ordner 1 und alles rechtsseitig des chars ] gegen den string WANT ersetzt, sodass der bsp. ordner dann [ 001 ] WANT heißt?
Da die Ordnerstruktur ohnehin neu erstellt werden muss, ließe sich das in den "Verschiebe"-Teil einarbeiten oder natürlich auch in einem weiteren Script bewerkstelligen.

Wie lautet die genaue Regel für das Umbenennen? Ich hätte es so verstanden, dass in jedem Ordnernamen mit dem Bestandteil "]" der dahinter folgende Teil durch Blank und "WANT" ersetzt werden soll, was dann allerdings auch bereits die im Root liegenden Ordner "I:\-=[ A ]=-\" etc beträfe).

... modifikation in die richtung vorzunehmen, per interaktion nach ordnern zu suchen, die nur einen vom nutzer vorgebbaren typ datei beinhalten ...
Auch hierzu eine Bitte um Klarstellung:

Zu suchen wären Ordner, welche ausschließlich Dateien (oder doch auch Unterordner) enthalten, wobei dies nur Dateien eines vorgegebenen Typs sein dürfen?

Sollen die gefundenen Ordner dann inklusive Dateien (und ggf Unterordner) verschoben (bzw, wenn das Ziel eine andere Partition ist, wie oben bereits erwähnt, kopiert und am ursprünglichen Ort gelöscht) werden?

Grüße
bastla

P.S.: Ich helfe gerne (im Rahmen meiner, natürlich auch zeitlich begrenzten, Möglichkeiten). Dass Du aus dieser Tatsache bzw aufgrund meiner bisherigen Unterstützung nicht eine Art "Anspruch" ableiten willst, ist meiner Motivation sicher förderlich.
Bitte warten ..
Mitglied: Clubnite
01.01.2008 um 21:32 Uhr
hallo bastla,

danke für den hinweis mit der formatierung. ich hatte es mal mit [code] probiert, weil mir das bekannt ist zur code-formatierung, aber das hatte nicht geklappt. jetzt fällt mir auch grad oben der link zur Formatierungs-hilfe auf. ^^ ich gelobe besserung. *hehe*

nun ans eingemachte. also dein verständnis ist richtig:
01.
Ich hätte es so verstanden, dass in jedem Ordnernamen mit dem Bestandteil "]" der  
02.
dahinter folgende Teil durch Blank und "WANT" ersetzt werden soll, was dann  
03.
allerdings auch bereits die im Root liegenden Ordner "I:\-=[ A ]=-\" etc beträfe.
die root-ordner bleiben davon unberührt. zum einen vorsätzlich und zum anderen automatisch, denn alle unterordner unterscheiden sich hinsichtlich der ] dadurch, dass im bei ihnen direkt danach IMMER ein blank steht, ehe der nächste char kommt, ab welchem dann der gesamte ordnername gegen WANT ausgetauscht wird, während die root-ordner direkt hinter dem ] das = stehen haben. den blank brauchst du also nicht zu ersetzen sondern könntest du als "fallunterscheidungskriterium" nehmen der art:
01.
pseudocode: 
02.
wenn ] gefolgt von = dann ignore 
03.
ansonsten 'nächstes zeichen ist ein blank 
04.
lösche alle zeichen und schreibe WANT
dem geht jedoch noch immer erst die suche der relevanten ordner voraus.
01.
Zu suchen wären Ordner, welche ausschließlich Dateien (oder doch auch Unterordner) 
02.
enthalten, wobei dies nur Dateien eines vorgegebenen Typs sein dürfen?
die anvisierten ordner sollten entweder ganz leer sein, oder aber dateien vom typ .txt, .nfo, .jpg, .gif, .bmp, .png, .message enthalten. wenn sie ordner enthalten,
so heißen diese unterordner irgendwas mit "complete" und die solche header-ordner beinhaltenden ordner scheiden vom ganzen procedere aus. diese sache haben wir ja schon erfolgreich im griff.

hier nochmal der pfad zum verständnis:
01.
Drive:\ 
02.
-=[A]=-\ 
03.
[ Arm ]\ 
04.
[ Arm 001 ] Neuer Ordner_Neuer Ordner 1\ 
05.
[ ... complete ... ] , 00.sfv , 01 datei.jpg , 02 datei.txt
wenn [ Arm 001 ] Neuer Ordner_Neuer Ordner 1 einen solchen headerordner beinhaltet, ist alles in ordnung und er bleibt unberührt, weil die 00.sfv den header ... complete ... erstellt hat bei der prüfsummenberechnung. beinhaltet er jedoch keine .sfv, dann wurde auch keine header erstellt. es könnten aber dennoch .jpg oder andere der o.a. dateien hochgeladen worden sein. diese ordner gilt es einzusammeln und nach E:\Temp zu verschieben und in [ Arm 001 ] WANT umzubenennen.

die verschiebung ist eigentlich nur ein sicherheitsfeature. bisweilen hab ich es so verwendet:

1. betroffene ordner suchen
2. verschieben, um zu prüfen, ob auch nur solche verschoben wurden, wie es gedacht war
3. umbenennen in WANT z.b. [ Arm 001 ] WANT
4. erneut hochladen

wenn das script 100% zuverlässig läuft und nichts umbenannt oder gelöscht wird, das nicht so gehandelt werden soll, sondern nur wie vorgesehen, könnten punkte 2 und 4 auch weg gelassen werden.
Bitte warten ..
Mitglied: bastla
02.01.2008 um 12:17 Uhr
Hallo Clubnite!

... wenn sie ordner enthalten, so heißen diese unterordner irgendwas mit "complete" und die solche header-ordner beinhaltenden ordner scheiden vom ganzen procedere aus. diese sache haben wir ja schon erfolgreich im griff.
Eigentlich nicht - bisher werden nur leere Ordner näher untersucht, und daher wird nur unter der Voraussetzung, dass der Ordner leer ist, noch zusätzlich der Ordnername überprüft, sodass nur die "Header"-Ordner selbst ausscheiden. Ordnerinhalte (außer deren Absenz ) werden in der aktuellen Scriptfassung nicht berücksichtigt.

wenn [ Arm 001 ] Neuer Ordner_Neuer Ordner 1 einen solchen headerordner beinhaltet, ist alles in ordnung und er bleibt unberührt
Soferne also ein Ordner zumindest einen Unterordner mit dem Namensbestandteil "complete" enthält, ist dieser Ordner, unabhängig von enthaltenen Dateien und weiteren Unterordnern, zu ignorieren?

die anvisierten ordner sollten entweder ganz leer sein, oder aber dateien vom typ .txt, .nfo, .jpg, .gif, .bmp, .png, .message enthalten.
Bedeutet das, dass Du nicht nach einzelnen Dateitypen suchen, sondern eine Liste von Typen vorgeben und nur Ordner verschieben willst, in denen (mindestens eine? / ausschließlich?) in der Liste angeführte Dateien enthalten sind (und die natürlich nicht schon aufgrund der oben angeführten Kriterien ausgeschieden sind)?

Zusammenfassend würde daraus folgende Reihenfolge der Überprüfung resultieren:
01.
1) Enthält der Name des Ordners den Bestandteil "complete" oder "WANT"? 
02.
   - Wenn ja: Ordner übergehen; ansonsten: 
03.
 
04.
2) Enthält der Ordner einen Unterordner mit dem Namensbestandteil "complete" oder "WANT"? 
05.
   - Wenn ja: Ordner übergehen; ansonsten: 
06.
 
07.
3) Enthält der Ordner Unterordner mit anderem Namen? 
08.
   - Wenn ja: Sollte es nach Deiner Beschreibung eigentlich nicht geben (... wenn sie ordner enthalten, so heißen diese unterordner irgendwas mit "complete" ...) - falls doch: ? 
09.
   - Wenn nein: 
10.
 
11.
4) Enthält der Ordner Dateien? 
12.
   - Wenn nein: Ordner ist leer und wird verschoben; ansonsten: 
13.
 
14.
5) Ist zumindest eine Datei aus der angegebenen Dateitypenliste enthalten? 
15.
   - Wenn ja: Ordner wird verschoben.
Soferne verschoben wird, soll aber noch nicht sofort die Umbenennung erfolgen, um noch eine Überprüfung zu ermöglichen - daher wäre für diesen Zweck dann ein weiteres Script zuständig.
Noch ein Hinweis zur Formatierung: Zitate kannst Du einfach mit "> " einleiten ...

Grüße
bastla
Bitte warten ..
Mitglied: Clubnite
02.01.2008 um 14:27 Uhr
eher so:

1.) Enthält der Name des Ordners den Bestandteil "WANT" ?
- Wenn ja: Ordner übergehen; ansonsten nächste Punkte prüfen:

2.) Enthält der Ordner einen Unterordner mit dem Namensbestandteil "(in)complete" ?
- Wenn nein: ordner verschieben bzw. in [...] WANT umbenennen
- WANT können/sollen nur Ordner heißen, die in der 3. Ebene ausgehend von G:\ liegen --> siehe Pfadverlaufsskizze
- ein solcher Ordner kann nur WANT heißen, wenn er nicht das beinhaltet, was er beinhalten soll einschließlich einer prüfsummendatei
- demzufolge kann beim verschieben auch keine überprüfung der prüfsumme durch ein skript stattfinden und folglich auch kein [ complete ] header erstellt werden
- Wenn ja: Ordner übergehen

3) Enthält der Ordner Unterordner mit anderem Namen?
- ja: aber nur 1 leeren Header-ordner, mit "(in)complete" im namen
- und das auch nur dann, wenn die prüfsumme validiert werden konnte

4) Enthält der Ordner Dateien?
- Wenn ja: enthält er einen subordner mit dem namensteil "(in)complete", dann ignorieren, ansonsten verschieben
- Wenn nein: Ordner ist leer und ist zur Umbenennung in [...] WANT vorgesehen;

5) Ist zumindest eine Datei aus der angegebenen Dateitypenliste enthalten?
- Wenn ja: Ordner wird verschoben bzw. ist zur Umbenennung in [...] WANT vorgesehen

gruß, clubnite
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

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 ...