Zählen Sie rekursiv Dateien in Unterordnern

7

Ich versuche, die Dateien in allen Unterordnern in einem Verzeichnis zu zählen und sie in einer Liste anzuzeigen.

Zum Beispiel der folgende dirtree:

%Vor%

Sollte als Ausgabe geben:

%Vor%

Ich begann mit dem folgenden:

%Vor%

Jetzt habe ich eine Frage: Warum ist meine Funktion nicht rekursiv?

    
Pr0no 26.08.2014, 13:06
quelle

6 Antworten

17

So etwas sollte funktionieren:

%Vor%
  • dir -recurse listet alle Dateien im aktuellen Verzeichnis auf und pipettiert (|) das Ergebnis nach
  • ?{ $_.PSIsContainer } filtert nur die Verzeichnisse und leitet die Ergebnisliste erneut an
  • %{ Write-Host $_.FullName (dir $_.FullName | Measure-Object).Count } ist eine foreach-Schleife, die für jedes Mitglied der Liste ($ _) den vollständigen Namen und das Ergebnis des folgenden Ausdrucks anzeigt
  • (dir $_.FullName | Measure-Object).Count stellt eine Liste von Dateien unter dem Pfad $ _. FullName zur Verfügung und zählt Mitglieder über Messobjekt

  • ?{ ... } ist ein Alias ​​für Where-Object

  • %{ ... } ist ein Alias ​​für foreach
David Brabant 26.08.2014, 13:25
quelle
4

Ähnlich wie Davids Lösung funktioniert dies in Powershell v3.0 und verwendet keine Aliase, falls jemand mit ihnen nicht vertraut ist

%Vor%

Antwortaufschlag

Basierend auf einem Kommentar über die Einhaltung Ihrer Funktions- und Schleifenstruktur biete ich Folgendes an. Hinweis : Ich befürworte diese Lösung nicht, da sie hässlich ist und die eingebauten Cmdlets dies sehr gut handhaben . Wie auch immer ich helfen möchte, hier ist ein Update Ihres Skripts.

%Vor%

Zählen Sie für jedes $singleDirectory alle Dateien mit $count (die vor der nächsten Unterschleife zurückgesetzt wird) und geben Sie jedes Ergebnis in eine Hash-Tabelle aus. Am Ende geben Sie die Hashtabelle als String aus. In Ihrer Frage haben Sie so ausgesehen, als wollten Sie eine Objektausgabe statt eines geraden Textes.

    
Matt 26.08.2014 13:38
quelle
2

Nun, so wie Sie es tun, muss das gesamte Get-ChildItem Cmdlet abgeschlossen sein, bevor die foreach Schleife mit der Iteration beginnen kann. Bist du sicher, dass du lange genug wartest? Wenn Sie das gegen sehr große Verzeichnisse (wie C :) ausführen, wird es ziemlich lange dauern.

Edit: Sie haben vorher nach einer Möglichkeit gefragt, wie Sie Ihre Aufgabe machen können, um das zu tun, was Sie fragen. Hier können Sie loslegen.

%Vor%

Die foreach-Schleife ruft nur Verzeichnisse ab, da das alles ist, was uns interessiert. Dann wird innerhalb der Schleife ein benutzerdefiniertes Objekt für jede Iteration mit dem vollständigen Pfad des Ordners und der Anzahl der Elemente innerhalb des Ordners erstellt. p>

Beachten Sie auch, dass dies nur in PowerShell 3.0 oder neuer funktioniert, da der Parameter -directory in 2.0 nicht existiert

    
Noah Sparks 26.08.2014 13:13
quelle
0

Meine Version - etwas sauberer und Inhalte in eine Datei dumps

Original - Dateien in Unterordnern rekursiv zählen

Zweite Komponente - Elemente in einem Ordner mit PowerShell zählen

%Vor%     
ahaw021 21.11.2016 10:50
quelle
0

Ich habe die Lösung von David Brabant ein wenig modifiziert, um das Ergebnis zu bewerten:

%Vor%     
Antebios 12.12.2016 18:13
quelle
0
%Vor%     
ChiliYago 29.08.2017 21:18
quelle

Tags und Links