Benutzer mit den meisten Antworten
Parent dir von Verzeichnis ausgeben in denen die jüngste Datei älter als 180 Tage ist

Frage
-
Hallo zusammen,
zunächst zum Ziel:
Ich will eine Liste der Verzeichnissen (Pfad) haben deren Inhalt seit min 180 tagen nicht mehr angefasst wurden ( lastaccessdate).
Wie habe ich mir das gedacht:
Ich nehme meinen Pfad, lese die Unterverzeichnisse ein und lasse mir die mit dem Fullname in ein array schreiben. Das klappt auch:
in $Childitem habe ich die Einträge der UNterordner im Format
Z:\lan2lan\Projekte\Projekt2
etc.
SO nun habe ich mir gedacht ich nehme jeden Pfad in der $childitem und lasse den rekursiv nach objekten durchsuchen, davor soll aber der aktuelle Pfad in der variablen a$ zwischengespeichert werden, die gefundenen Objekte sollen in der variablen $item zwischengespeichert werden.
Jetzt soll er den array $item nehmen und nachsehen ob ein item darin lastaccestime größer(jünger) heute-180 Tage hat. Wenn ja interessierts mich nicht und weiter zum nächsten Pfad in $childitem.
Wenn aber kein item jünger als 180 Tage ist schreibe den zwischengespeichrten Pfad ($a) in die $list.
das Problem ist $list ist leer obwohl es definitiv ordner gibt die keiner mehr angefasst hat, bzw. wenn ich lastwritetime nehme die ich mir ja auch anzeigen lassen kann habe ich dasselbe Ergebnis.
Wo hab ich da meinen Denkfehler oder syntaxfehler?
Code:
$path = "Z:\lan2lan\Projekte\"
$Childitem = (get-childitem $path)| foreach-object {$_.fullname}
foreach($i in $childitem){$a = $_;$item = get-childitem $_ -recurse
foreach($i in $item){if($item.lastaccesstime -gt (get-date).adddays(-180)) {}
else {$list = $a}}
}
#$childitem
$listDanke & Grüße
Thomas
Antworten
-
Was die Powershell-Logik und Syntax betrifft, hilft in der Tat nur Lernen und bei Problemen hierher kommen. :) Zum Lernen kann ich übrigens nur wärmstens das Buch von Tobias Weltner empfehlen, das imho didaktisch am besten aufgebaut ist, besonders für Anfänger.
Und das in VB "alles einfacher" war, lass ich mal so stehen, aber merk dir's mal und schau mal in ein paar Wochen ob du das immer noch so siehst... ;-)
Was den Code betrifft, wenn du unbedingt alle Dateien untersuchen willst, musst du die Logik ändern. Momentan fügst du den Projektordnernamen schon zu Liste hinzu wenn nur ein Objekt gefunden wird, das älter als 180 Tage ist. Bei mehreren kommt der Name immer wieder in die Liste. Wenn dann mal eine jüngere Datei dabei ist, müsstest du eigentlich alle vorhergehenden Einträge dieses Pfades löschen. Was du aber machst, ist nur jetzt den Namen nicht zur Liste hinzuzufügen. Das geht so nicht. :)
Damit es funktioniert kannst du z.b. eine zweite Liste pflegen, die Anfangs alle Projektordner enthält und du dann die entfernst, in denen jüngere Dateien gefunden wurden.
Da es aber auch deutlich einfacher (Lösung oben) geht, ist die Frage ob du das überhaupt noch probieren willst.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 16. Februar 2012 14:40
- Als Antwort markiert T.Haag Montag, 20. Februar 2012 13:48
Alle Antworten
-
Du hast diverse Flüchtigkeits- und Syntaxfehler im Code: $_ geht nur in der Pipeline; im zweiten ForEach fragst du die Eigenschaften von Item ab nicht von $I; dann benutzt du zweimal $i für unterschiedliche Aufgaben etc...
Ich rate dir erstmal etwas sauberer zu arbeiten. Schreibe Code möglichst ordentlich und übersichtlich, benutze Variablennamen die eindeutig sind. Dann fallen viele Fehler viel eher ins Auge.
Zur Aufgabe: wenn dich nur die Ordner interessieren, in denen bei keinem Element in den letzten 180 Tage das LastAccessTime-Attribut geändert wurde, kannst du die Ordnerinhalte ignorieren und einfach das LastAccessTime-Attribut des Ordners checken.
zb. so:
$list = @() $path = "d:\tmp" $today = get-date $projectfolders = get-childitem $path | Where-Object { $_.PSIsContainer } # nur Ordner beachten foreach($folder in $projectfolders){ if( $folder.lastaccesstime -lt $today.adddays(-180) ) { $list += $folder.fullname, $folder.lastaccesstime } } $list
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 16. Februar 2012 13:02 Typo
-
Hi Denniver,
Was das sauber arbeiten angeht, ja gebe ich dir recht gelobe besserung aber die powershellogik hat sich mir noch nicht ganz erschlossen, wann ich pipen und "sortieren" kann und wann das ganze dann doch in eine Schleife / IF Abfrage muss, ganz zu schweigen vom syntax wo muss was hin und wo kann ich was übergeben. Beschäftige mich auch erst eine Woche ein wenig intensiver mit PS, in VB war alles irgendwie einfacher ;-)
Hier mal ein Versuch das ganze ein wenig übersichtlicher darzustellen und ein paar fehler auszumerzen, ich will ja wissen wie manns richtig macht
Danke
$path = "Z:\lan2lan\Projekte\" $list =@() $Childitem = (get-childitem $path)| foreach-object {$_.fullname} foreach($c in $childitem){ $n = $c;$item = get-childitem $c -recurse foreach($i in $item){ if($i.lastaccesstime -gt (get-date).adddays(-180)) {} else {$list += $n} } } $list
-
Was die Powershell-Logik und Syntax betrifft, hilft in der Tat nur Lernen und bei Problemen hierher kommen. :) Zum Lernen kann ich übrigens nur wärmstens das Buch von Tobias Weltner empfehlen, das imho didaktisch am besten aufgebaut ist, besonders für Anfänger.
Und das in VB "alles einfacher" war, lass ich mal so stehen, aber merk dir's mal und schau mal in ein paar Wochen ob du das immer noch so siehst... ;-)
Was den Code betrifft, wenn du unbedingt alle Dateien untersuchen willst, musst du die Logik ändern. Momentan fügst du den Projektordnernamen schon zu Liste hinzu wenn nur ein Objekt gefunden wird, das älter als 180 Tage ist. Bei mehreren kommt der Name immer wieder in die Liste. Wenn dann mal eine jüngere Datei dabei ist, müsstest du eigentlich alle vorhergehenden Einträge dieses Pfades löschen. Was du aber machst, ist nur jetzt den Namen nicht zur Liste hinzuzufügen. Das geht so nicht. :)
Damit es funktioniert kannst du z.b. eine zweite Liste pflegen, die Anfangs alle Projektordner enthält und du dann die entfernst, in denen jüngere Dateien gefunden wurden.
Da es aber auch deutlich einfacher (Lösung oben) geht, ist die Frage ob du das überhaupt noch probieren willst.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 16. Februar 2012 14:40
- Als Antwort markiert T.Haag Montag, 20. Februar 2012 13:48
-
So meine lieben Freunde der rythmischen Scriptgymnastik,
nachdem ich ein wenig Zeit hatte habe ich weiter daran rumgepfuscht..und tadaa es macht zumindest was ich will, auch wenn man das ganze bestimmt auch wesentlich schicker schreiben kann.
$list2 = @() $check = @() $path = "z:\lan2lan\Projekte\" $today = get-date $projectfolders = get-childitem $path | Where-Object { ($_.PSIsContainer) -and ($_.lastwritetime -lt $today.AddDays(-180)) } # nur Ordner beachten die älter 180 Tage foreach($folder in $projectfolders){ $check = $null $check = Get-ChildItem $folder.FullName -Recurse |Where-Object{($_.lastwritetime -gt $today.AddDays(-180))} if (!$check){$list2 += $folder.FullName} else {} } $list2| out-file "W:\folder_180_1.txt"