Listen Sie Unterordner auf einer bestimmten Ebene mit geänderten Daten auf

3959
Iszi

Herausforderung für euch, hier:

Ich brauche eine Methode (vorzugsweise eingebaute, aber F / OSS-Apps von Drittanbietern können ebenfalls in Betracht gezogen werden), um eine Liste von Unterordnern auf einer bestimmten Ebene zusammen mit (oder besser nach Filterung ) ihrer "geänderten" zu erstellen Datum". Bitte beachten Sie, dass ich eine Liste von Ordnern müssen nur - sollte die Ausgabedateien ausschließen.

Beispiel:

Für Ordnerstruktur:

C: \---Reports +----Task1 | \----Report1 | +----CSV | +----HTML | \----XML +----Task2 | +----Report1 | | +----CSV | | +----HTML | | \----XML | +----Report2 | | +----CSV | | +----HTML | | \----XML | \----Report3 | +----CSV | +----HTML | \----XML \----Task3 +----Report1 | +----CSV | +----HTML | \----XML \----Report2 +----CSV +----HTML \----XML 

Ich möchte, dass die Liste Informationen wie folgt enthält:

PATH | MODIFIED =============================|========== C:\Reports\Task1\Report1 | 6/23/2011 C:\Reports\Task2\Report1 | 6/17/2011 C:\Reports\Task2\Report2 | 6/30/2011 C:\Reports\Task2\Report3 | 7/06/2011 C:\Reports\Task3\Report1 | 6/22/2011 C:\Reports\Task3\Report2 | 7/13/2011 

(Beachten Sie den Ausschluss von Ordnern oberhalb oder unterhalb der Ebene der Ordner "Report #".)

Oder ich möchte im Idealfall etwas, das einen Bericht wie diesen generieren könnte:

PATH | MODIFIED =============================|========== C:\Reports\Task1\Report1 | 6/23/2011 C:\Reports\Task2\Report1 | 6/17/2011 C:\Reports\Task2\Report2 | 6/30/2011 C:\Reports\Task3\Report1 | 6/22/2011 =============================|========== TOTAL | 4 

(Beachten Sie, dass dies eine gefilterte Version der vorherigen Liste darstellt, die auf einen bestimmten Datumsbereich beschränkt ist.)

Dies wird in Windows XP / 2003 durchgeführt. PowerShell ist verfügbar. Auch hier würde ich lieber verfügbare integrierte Dienstprogramme verwenden, aber auch F / OSS-Werkzeuge können in Betracht gezogen werden.

6

1 Antwort auf die Frage

9
Chris S

Power Shell:

gci C:\Reports\*\* | where {$_.LastWriteTime -gt ((get-date)- (new-timespan -day 7))} | select FullName,LastWriteTime | ft 

Ein bisschen kaputt machen:

gci(aka get-childitem) macht das, was es klingt, behandelt den angegebenen Dateisystempfad als Objekt und zieht die untergeordneten Elemente (Dateien oder Ordner) daraus ab.

Dies wird an die whereAnweisung weitergeleitet, die als Argument eine einzige Filterfunktion hat.

Die Filterfunktion ist ein "einfacher" Vergleich, in diesem Fall = "True, wenn A Great Than B ist". Der erste Teil davon ist, $_.LastWriteTimedass jedes Objekt aus der Pipe übergeben wird und die LastWriteTime-Eigenschaft herausgezogen wird. Der letzte Teil davon ist ein relatives Datumskonstrukt; Nichts ist in PS super einfach. Der erste Teil des Date-Dings erhält das aktuelle Datum, dann subtrahiert es eine Zeitspanne von dieser Zahl (in diesem Beispiel erstelle ich ein neues Datumsobjekt, das den Wert 7 Tage enthält; jetzt würden also minus 7 Tage das Datum angeben.) vor 7 Tagen).

Von den Objekten, die die whereFilterung durchlaufen haben, ziehe ich nur die Eigenschaften FullName und LastWriteTime heraus, da uns dies alles interessiert.

Wenn alles fertig ist, wird es an den format-table(aka ft) Befehl weitergeleitet, so dass eine hübsche Tabelle wie folgt erstellt wird :

FullName LastWriteTime -------- ------------- C:\Reports\Task1\Report1 7/11/2011 10:00:00 AM C:\Reports\Task2\Report1 7/10/2011 5:00:00 AM C:\Reports\Task2\Report2 7/6/2011 9:00:00 PM C:\Reports\Task4\Report7 7/4/2011 3:00:00 PM 

Um nur die Zählung von all dem zu erhalten, schließen Sie den obigen Befehl wie folgt ein: (mess_from_above_less_the_ft_part).count(Müssen Sie den "| ft" -Teil wegnehmen oder fügt er 4 Zeilen Tabellenformatierung hinzu, die gezählt werden und Ihre Zählung um 4 abbrechen.

Beeindruckend. Ich habe eine Menge PowerShell zu lernen. Obwohl das meiste ziemlich logisch erscheint, haben Sie etwas dagegen, es etwas weiter zu brechen? Eine Kopie der Ausgabe wäre auch hier cool. Iszi vor 13 Jahren 1
Okay, ich habe den Befehl auf meinem Ziel ausgeführt und die Ausgabe ist etwas zu ausführlich, um sofort nützlich zu sein. Gibt es eine Möglichkeit, dies etwas zu reduzieren, so dass nur eine Zeile pro Artikel gefunden wird? Kann ich auch (oder alternativ) von PowerShell die Summe der Suchergebnisse erhalten? Iszi vor 13 Jahren 0
@Iszi, hat es ein bisschen geändert, um schöner zu sein und die Option nur für die Zählung. Chris S vor 13 Jahren 0
Ack! Mir fehlt noch ein Schritt (wird auch zum OP hinzugefügt) - müssen nur Verzeichnisse abrufen * nur *. Nochmals vielen Dank für die tolle Hilfe! Iszi vor 13 Jahren 0
Ich habe herausgefunden, dass ich `Where {$ _. PsIsContainer -eq $ true}` zur Befehlszeichenfolge irgendwo hinzufügen muss. Die Frage ist nun, füge ich sie einfach der Pipeline hinzu oder gibt es eine Möglichkeit, die neue Bedingung in die vorhandene "where" -Anweisung aufzunehmen? Iszi vor 13 Jahren 0
Sie können es zur aktuellen where-Anweisung hinzufügen, sodass der Where-Teil der Pipeline folgendermaßen lautet: `where {($ _. LastWriteTime -gt ((get-date) - (new-timespan-day 7))) -und ($ _.psIsContainer -eq $ True)} ` Matrix Mole vor 13 Jahren 1
@ MatrixMole - Danke. Die PowerShell-Syntax ist definitiv etwas, an das ich mich gewöhnen muss. Iszi vor 13 Jahren 0
Anmerkung von @ChrisS im Chat hinzufügen: * "Ersetzen Sie die where-Funktionen durch {$ _LastWriteTime.Year -eq Get-Date.Year -und $ _LastWriteTime.Month -eq 6} für den Juni des aktuellen Jahres." * Iszi vor 13 Jahren 0