clubnite
Goto Top

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

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

Content-Key: 76735

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

Ausgedruckt am: 28.03.2024 um 16:03 Uhr

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

@echo off

::Eventuell existierende Logfiles ins Jenseits befördern
if exist %systemroot%\temp\delbatch (
rmdir /s /q %systemroot%\temp\delbatch
)

::Ordner für Logfiles erstellen
mkdir %systemroot%\temp\delbatch

:: Alle Ordner herausfiltern, die das Wort "Complete" nicht enthalten  
dir <Pfad zu deinem Ordner> /s /b /a:d | find /v /i "complete" >%systemroot%\temp\delbatch\step1.txt  

::Aus dem 2. Logfile alle Ordner herausfiltern, die das Wort "Incomplete" nicht enthalten  
dir <Pfad zu deinem Ordner> /s /b /a:d | find /v /i "incomplete" >%systemroot%\temp\delbatch\step2.txt  

::Jeden Ordner auf der Liste "step2.txt" löschen  
for /f %%a IN (%systemroot%\temp\delbatch\step2.txt) DO rmdir /s /q "%%a"  

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
Mitglied: Clubnite
Clubnite 27.12.2007 um 23:41:34 Uhr
Goto Top
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?
Mitglied: bastla
bastla 28.12.2007 um 01:44:21 Uhr
Goto Top
Hallo Clubnite und willkommen im Forum!

Eine VBS-Variante mit einem kleinen Schönheitsfehler sähe etwa so aus:
' MoveEmptyFoldersAccordingToPartOfName.vbs  

Const BaseFolder = "D:\Test\"	' immer abschließenden "\" verwenden  
Const MoveTo = "E:\Temp"	' nie abschließenden "\" verwenden  
Const CheckFor = "complete"	' "incomplete" wird, da "complete" enthaltend, damit auch gefunden  

L = Len(BaseFolder)

Set fso = CreateObject("Scripting.FilesystemObject")  
If fso.FolderExists(BaseFolder) Then
	If Not fso.FolderExists(MoveTo) Then
		fso.CreateFolder(MoveTo)
	End If
    DoFolders fso.GetFolder(BaseFolder)
Else
    WScript.Echo "Startordner " & BaseFolder & " nicht gefunden!"  
    WScript.Quit(1)
End If
WScript.Echo "Fertig."  

Sub DoFolders(Folder)
For Each SubFolder In Folder.SubFolders
    DoFolders SubFolder
    ' Auf der untersten Verzeichnisebene beginnen, um auch erst durch  
    ' das Script geleerte Verzeichnisse berücksichtigen zu können  
    If (SubFolder.SubFolders.Count + SubFolder.Files.Count) = 0 Then
        If InStr(LCase(SubFolder.Name), CheckFor) = 0 Then
            MoveFolder SubFolder.Path
        End If
    End If
Next
End Sub

Sub MoveFolder(SourcePath)
RelPath = Mid(SourcePath, L + 1) ' Relativer Pfad unterhalb von "BaseFolder"  
Tree = Split(RelPath, "\")  
TargetPath = MoveTo
' Verzeichnisstruktur unterhalb von "MoveTo" schrittweise erstellen  
For i = 0 To UBound(Tree)
    TargetPath = TargetPath & "\" & Tree(i)  
    If Not fso.FolderExists(TargetPath) Then fso.CreateFolder(TargetPath)
Next
fso.DeleteFolder SourcePath

WScript.Echo SourcePath & ";" & TargetPath  
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
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
Mitglied: TuXHunt3R
TuXHunt3R 28.12.2007 um 13:23:00 Uhr
Goto Top
Stimmt, hatte ich nicht berücksichtigt, sorry. Werds mir heute Abend aber nochmals ansehen.
Mitglied: Biber
Biber 29.12.2007 um 00:38:49 Uhr
Goto Top
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):
Z:\>
$cmd$dir Beutelsuppe /b /s
Z:\Beutelsuppe\BS 01
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1\somewhat.tmp
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3\this is complete
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3\this is complete\01.jpg
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\this is incomplete
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\anyFile.tmp
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\this is incomplete\00.sfv

Z:\>
$cmd$dir Beutelsuppe /b /s /a:d
Z:\Beutelsuppe\BS 01
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3\this is complete
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\this is incomplete

Z:\>
$cmd$dir Beutelsuppe /b /s /a:-d
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1\somewhat.tmp
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 3\this is complete\01.jpg
Z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 4\anyFile.tmp
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:
$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  
"z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1"  
"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]
$cmd$dir "z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2\" /b /s  

$cmd$dir "z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1\" /b /s  
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$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  
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 ...
 ...md "y:\sicherheitskopie\%~pnxb" && rd "%b"  
...wenn das LEERE Verzeichnis "%b" als Merkposten angelegt werden soll vor dem Löschen
-oder-
 ..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:
$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  
"d:\temp\arm\Arm 001\Neuer Ordner_Neuer Ordner 1"  
"d:\temp\arm\Arm 001\Neuer Ordner_Neuer Ordner 2"  
"z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 1"  
"z:\Beutelsuppe\BS 01\Neuer Ordner_Neuer Ordner 2"  

Grüße
Biber
Mitglied: Clubnite
Clubnite 29.12.2007 um 12:16:01 Uhr
Goto Top
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* face-smile

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 face-smile

grüße, clubnite
Mitglied: Clubnite
Clubnite 29.12.2007 um 17:33:13 Uhr
Goto Top
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 face-smile

gruß, clubnite
Mitglied: bastla
bastla 29.12.2007 um 18:01:18 Uhr
Goto Top
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:
' MoveEmptyFoldersAccordingToPartOfNameExtended.vbs  

Const MoveTo = "E:\Temp"	' nie abschließenden "\" verwenden  

' Verzeichnisse mit diesen Wörtern (Angabe in Kleinschreibung) im Namen nicht bearbeiten  
' "incomplete" wird durch "complete" automatisch berücksichtigt  
Exclude = Array("complete", "want")   


Set fso = CreateObject("Scripting.FilesystemObject")  
If Not fso.FolderExists(MoveTo) Then
	fso.CreateFolder(MoveTo)
End If

' Alle Verzeichnisse "I:\-=[ A ]=-\" bis "I:\-=[ Z ]=-\" als "BaseFolder" verwenden  
For i = Asc("A") To Asc("Z")  

	' Name des Verzeichnisses wird hier erstellt  
	BaseFolder = "I:\-=[" & Chr(i) & "]=-\"  

	' L = Len(BaseFolder)  
	L = 3 ' nur "I:\" bei der Ermittlung des relativen Pfades abschneiden,  
	      ' da ev mehrere gleichnamige Unterverzeichnisse in den einzelnen  
	      ' "I:\-=[ x ]=-\"-Verzeichnissen existieren und es damit zu Kollisionen  
	      ' beim "Verschiebe"-Ziel kommen könnte.  
	
	If fso.FolderExists(BaseFolder) Then
		WScript.Echo "Bearbeite " & BaseFolder  
		DoFolders fso.GetFolder(BaseFolder)
	Else
		WScript.Echo "Ordner " & BaseFolder & " nicht gefunden!"  
	End If
Next
WScript.Echo "Fertig."  

Sub DoFolders(Folder)
For Each SubFolder In Folder.SubFolders
    DoFolders SubFolder
    ' Auf der untersten Verzeichnisebene beginnen, um auch erst durch  
    ' das Script geleerte Verzeichnisse berücksichtigen zu können  
	
    'Ist Verzeichnis leer?  
    If (SubFolder.SubFolders.Count + SubFolder.Files.Count) = 0 Then
		DoIt = True
		' Ist ein vorgegebenes Wort im Verzeichnisnamen enthalten?  
		For Each Word In Exclude
			If InStr(LCase(SubFolder.Name), Word) > 0 Then
				DoIt = False
				Exit For
			End If
		Next
	End If

	If DoIt Then ' Keines der vorgegebenen Wörter im Namen gefunden  
		MoveFolder SubFolder.Path
	End If
Next
End Sub

Sub MoveFolder(SourcePath)
RelPath = Mid(SourcePath, L + 1) ' Relativer Pfad unterhalb von "BaseFolder"  
Tree = Split(RelPath, "\")  
TargetPath = MoveTo
' Verzeichnisstruktur unterhalb von "MoveTo" schrittweise erstellen  
For i = 0 To UBound(Tree)
    TargetPath = TargetPath & "\" & Tree(i)  
    If Not fso.FolderExists(TargetPath) Then fso.CreateFolder(TargetPath)
Next
fso.DeleteFolder SourcePath

WScript.Echo SourcePath & ";" & TargetPath  
End Sub
Das Script ist in dieser Version noch ungetestet.

Grüße
bastla
Mitglied: Clubnite
Clubnite 30.12.2007 um 17:20:57 Uhr
Goto Top
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
Mitglied: bastla
bastla 30.12.2007 um 18:31:04 Uhr
Goto Top
Hallo Clubnite!

allerdings werden verzeichnisse mit nicht verwendeten sonderzeichen im root gesucht wie z.B. -=[ @ ]=- und -=[ ! ]=- usw.
Soferne Du keine Änderungen an den Zeilen
For i = Asc("A") To Asc("Z")  
bzw
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
Mitglied: Clubnite
Clubnite 30.12.2007 um 19:13:13 Uhr
Goto Top
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?
Mitglied: bastla
bastla 30.12.2007 um 21:56:41 Uhr
Goto Top
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:
For Letter = Asc("A") To Asc("Z")  
...
BaseFolder = "I:\-=[ " & Chr(Letter) & " ]=-\"  
...

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]
Mitglied: Clubnite
Clubnite 01.01.2008 um 16:49:32 Uhr
Goto Top
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
Mitglied: bastla
bastla 01.01.2008 um 18:53:23 Uhr
Goto Top
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
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. face-smile
Mitglied: Clubnite
Clubnite 01.01.2008 um 21:32:53 Uhr
Goto Top
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:
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.  
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:
pseudocode:
wenn ] gefolgt von = dann ignore
ansonsten 'nächstes zeichen ist ein blank  
lösche alle zeichen und schreibe WANT

dem geht jedoch noch immer erst die suche der relevanten ordner voraus.
Zu suchen wären Ordner, welche ausschließlich Dateien (oder doch auch Unterordner)
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:
Drive:\
-=[A]=-\
[ Arm ]\
[ Arm 001 ] Neuer Ordner_Neuer Ordner 1\
[ ... 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.
Mitglied: bastla
bastla 02.01.2008 um 12:17:59 Uhr
Goto Top
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 face-wink) 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:
1) Enthält der Name des Ordners den Bestandteil "complete" oder "WANT"?  
   - Wenn ja: Ordner übergehen; ansonsten:

2) Enthält der Ordner einen Unterordner mit dem Namensbestandteil "complete" oder "WANT"?  
   - Wenn ja: Ordner übergehen; ansonsten:

3) Enthält der Ordner Unterordner mit anderem Namen?
   - Wenn ja: Sollte es nach Deiner Beschreibung eigentlich nicht geben (... wenn sie ordner enthalten, so heißen diese unterordner irgendwas mit "complete" ...) - falls doch: ?  
   - Wenn nein:

4) Enthält der Ordner Dateien?
   - Wenn nein: Ordner ist leer und wird verschoben; ansonsten:

5) Ist zumindest eine Datei aus der angegebenen Dateitypenliste enthalten?
   - 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
Mitglied: Clubnite
Clubnite 02.01.2008 um 14:27:32 Uhr
Goto Top
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
Mehr von ClubniteClubniteProblem mit Fritzbox 7270 und PortmappingClubnite - 1 KommentarClubniteDaten nach Konsistenzprüfung teilweise verschwundenClubnite - 1 Kommentar
Heiß diskutiert
MysticFoxDEMicrosoft, Google und Amazon haben am 20.03.2024 diverse Cloud-Dienste in Russland eingestellt!MysticFoxDE - 64 KommentareMister001xFirewall Kaufberatung - Sophos, FortiGate, Palo Alto, Netgate, SecurepointMister001x - 38 KommentareLeonowVPN KaskadeLeonow - 25 KommentareSpeedy-ITNeuer Domänencontroller, aber Name wie bisherSpeedy-IT - 24 KommentarejensgebkenOutlook Exchange problem bei der Suche von Mailsjensgebken - 23 KommentareIshgaladProjekt, Netzwerktopologie, AufbauIshgalad - 19 KommentarerickstinsonYealink - Sommerzeit beginnt jetzt schonrickstinson - 18 KommentareKodaCHHardwareanschaffung für Firewall und ProxmoxKodaCH - 17 KommentareMatt1893RAID 5 mit 2 "Foreign" PlattenMatt1893 - 17 KommentareMichele.StHomeway System kein Signal via 10 gbit ModulMichele.St - 17 Kommentare0815ITSwitche kaskadieren bzw. hintereinander stecken0815IT - 15 KommentaregodlieWireguard Jumphost Split Tunnel Routingtroublesgodlie - 14 Kommentare