VisualBasic VB Script Ordner auflisten die zum Beispiel älter als 2013 sind

Antonio778877

Cadet 1st Year
Registriert
März 2016
Beiträge
13
Hallo zusammen,

Ich wollte eigentlich ein VB Script schreiben das mir alle Ordner auflistet die zum Beispiel älter als 2013 sind. Nun ist es so das das Datum gar nicht berücksichtigt wird, sondern es werden alle Ordner aufgelistet die auch jünger als 2013 sind. Hier mein Script:

Pfad = InputBox("Bitte geben den Pfad ein")
dim liste, listeold



set fs = createobject("Scripting.FileSystemObject")

Sub Listordner(ordner)

Set ordner = fs.getfolder(ordner)
For Each file In ordner.files
liste = liste & file.path & vbCr
if DateDiff("d", file.DateLastModified, Now) < 2013 then listeold = listeold
Next
For Each unterordner In ordner.subfolders
liste = liste & unterordner.path & vbCr
next

set logbuch = fs.opentextfile("C:\Test.txt", 8, true,0)
logbuch.writeline liste & vBCr
logbuch.close
set logbuch = fs.opentextfile("C:\Test.txt", 8, true,0)
logbuch.writeline listeold & vBCr
logbuch.close

End Sub

ordner =pfad
Listordner ordner
anz_dateien = ordner.Files.Count
msgbox "Anzahl:" & CHR(13) & CHR(13) & anz_dateien
msgbox "Dateien im Ordner:" & CHR(13) & CHR(13) & liste
msgbox "Listold:" & CHR(13) & CHR(13) & listold

Kennt sich jemand damit aus? Was mach ich falsch?

Danke
 
Man kann hier Code auch formatiert innerhalb von CODE Tags einfügen.

Zum Problem: Wieso den DateDiff? Habe aber nur kurz drüber geguckt.
 
Wenn ich mich nicht täusche müsste die DateDiff-Zeile eher heißen:
Code:
if DateDiff("d", file.DateLastModified, 2013) >= 0 then listeold = listeold
DateDiff gibt ja die Differenz in Tagen an, also macht 2013 gar keinen Sinn als Vergleichswert mit dem Ergebnis von DateDiff.

Wobei du bei 2013 evtl noch Feintuning brauchst, da du die Tagesdifferenz nimmst, kann es gut sein, dass 2013 intern als 1.1.2013 umgerechnet wird, womit alle Ordner nach dem 1.1.2013 trotzdem rausfliegen.
 
@miac:
Wäre wahrscheinlich geschickter, weil man dann das von mir angesprochene Datumsproblem wohl gar nicht erst hätte :)

@Antonio:
Kleine Anmerkung: Ich finde ja (halb)deutschen Code ziemlich übel, wenn du variablen "unterordner" nennst und sie ordner.subfolders zuweist. Da graut es mir persönlich etwas, ich bevorzuge immer englisch, alleine wegen der Lesbarkeit in Verbindung mit solchen Systemvariablen/-properties. Zumal deine Sub ja dann genau genommen "ordnerAuflisten" oder so heißen sollte, wenn man es schon deutsch macht. Nur so als Denkanstoß :)
 
Zuletzt bearbeitet:
Hi pcBauer

Danke für deine Antwort. Es ist so das ich das Script aus mehreren Scripts zusammengefügt habe, weswegen auch einige Definitionen auf Deutsch und die anderen auf Englisch sind. Was meinst du mit Feintuning? Und wie würde das gehen das Jahr zu extrahieren was miac vorgeschlagen hat?

Danke
 
Das was miac vorgeschlagen hat müsste mit folgendem Code funktionieren:
Code:
if file.DateLastModified.Year < 2013 then listeold = listeold

Wobei ich nicht Weiß ob Year tatsächlich eine Eigenschaft von DateLastModified ist.. ist es denn ein Objekt mit den Eigenschaften oder nur ein String?
In der Dokumentation von Visual Basic sehe ich dass bei DateTime-Objekten so einfach auf diese Eigenschaften zugegriffen werden kann, bei Date steht davon allerdings nichts..

Kenne mich auch leider nicht sonderlich mit VB aus.
 
Nope, funktioniert nicht.. :( Bekomme folgende Fehlermeldung: 2016-03-24 14_17_58-Windows Script Host.png
Das scheint ohne file.DateLastModified nicht zu gehen. Naja mal sehen ob sonst noch jemand eine Idee hat oder ich sogar selbst zu einer komme.

Danke trotzdem
 
ist dieses file.DateLastModified überhaupt mit irgendwas gesetzt? Also eben zum Beispiel n String, der das Datum widerspiegelt oder komplett ungültig?
dann könntest du ja doch wieder über das DateDiff gehen, das funktionierte prinzipiell?
Code:
if DateDiff("d", file.DateLastModified, 2013) > 0 then listeold = listeold
Ging der Code (quasi der von mir zuerst vorgeschlagene) eigentlich?

Wenn er prinzipiell geht ist ja vor allem interessant, wie er mit Dateien/Ordnern umgeht, die die Grenzfälle darstellen, also 31.12.2012 und 01.01.2013, eine Datei mit erstem Datum ausgegeben wird und eine andere mit zweitem Datum ausgelassen wird, dann funktioniert die Bedingung ja nach deinen Wünschen.
 
Zuletzt bearbeitet:
Nein, ist es nicht, da ich dachte das n String nicht umedingt gesetzt werden muss. Hab mir aber gar nicht überlegt wie das mit so einem String aussehen könnte. Den ersten Code den du vorgeschlagen hattest funktionierte auch nicht. Habe das schon getestet aber mir wurden wieder alles Ordner aufgelistet. Kannst du mir mit dem String da ein bisschen weiter helfen?
 
Hier wird gezeigt, wie man einen Zeitstempel von einer Datei bekommt, vllt klappt es damit vielleicht?
Ist gerade leider etwas ins Blaue raten, weil ich kein VB hier laufen hab, um das zu testen, und mich wie gesagt eigentlich nicht damit auskenne, aber die Doku/Stackoverflow zeigt eigentlich, wo es lang geht, dass das ganze läuft :)
 
VBS ist in jeder Windows Version.

Du kannst das Jahr folgendermaßen extrahieren:

DatePart("yyyy", file.DateLastModified)
 
@pcBauer

Vielen dank für deine Hilfe. Werde mich mit deinem Link ein bisschen beschäftigen.

@miac

Hab ich auch schon probiert aber blieb weiterhin erfolglos...
 
Was funktioniert denn nicht? Der Vergleich?

Du kannst die Variablen bzw. Funktionsergebnisse ja auch mit msgbox ausgeben.
 
Zuletzt bearbeitet:
Wie schon oben genannt, werden mir alle Ordner aufgelistet. Und das will ich nicht! Ich will ja nur das das Script mir alle Ordner auflistet DIE ÄLTER als 2013 sind.
 
Das ist schon klar. Aber der Vergleich müßte nun funktionieren. Habe ich extra nochmal ausprobiert.

Was in deinem If Statement steht, verstehe ich aber nicht.
Was soll listeold = listeold
 
Eigentlich nehme ich Schmerzensgeld für VBA. Das hier sollte halbwegs funktionieren.

Du hattest vermischt was Dateien und was Ordner sind.

Code:
folderToCheck = InputBox("Bitte geben den Pfad ein","Pfad","c:\workspace")

set fs = createobject("Scripting.FileSystemObject")

Set oFolder = fs.getfolder(folderToCheck)

'wir wollen die unterordner, nicht die dateien
For Each subfolder in oFolder.subfolders
	subfolderList = subfolderList & subfolder.path & vbCr

	'datediff subtrahiert das dritte argument vom zweiten
	'haben wir negative werte heisst das, dass der ordner älter als 2013 ist
	if( DateDiff( "d", CDate( "2013-01-01"), subfolder.DateLastModified ) < 0 ) then
		oldSubfolderList = oldSubfolderList & subfolder.path & vbCr
	end if

Next

msgbox "Anzahl Ordner:" & CHR(13) & CHR(13) & oFolder.Subfolders.count
msgbox "Anzahl Unterordner:" & CHR(13) & CHR(13) & subfolderList 
msgbox "Anzahl alter Ordner:" & CHR(13) & CHR(13) & oldSubfolderList
 
Hi Brotkrumen

Danke für deine Antwort. Habe deinen Code ausprobiert und bekomme beim starten folgende Fehlermeldung: Zeile 16, Anweisung erwartet. Was für eine Anweisung braucht er da?
 
Zuletzt bearbeitet:
Wie versuchst du das auszuführen? Gerade nochmal geguckt und das funktioniert bei mir sowohl in als .vbs Datei und als Makro in Excel ("public sub checkfolders()" davor klatschen und "end sub" dahinter).
 
Ganz normal als .vbs
Ich habe ein bisschen recherchiert und habe herausgefunden dass das end if zu viel war. Sobald ich das gelöscht habe, hat es wunderbar funktioniert. Ich weiss nicht ob du das auch so gemacht hast oder wie es auf deinem Code beschrieben hast. Aufjedenfall funktioniert das jetzt. Genau das habe ich gesucht. Jetzt muss ich nur noch schauen das er mir die Ordner die ich per msg box bekomme irgendwo auf einer txt Datei schreibt und speichert.
Vielen Dank
 
Zurück
Oben