Rekursiv Dateien zählen in Unterordner
Ich versuche zu zählen, die Dateien in alle Unterordner in einem Verzeichnis und stellt Sie in einer Liste.
Zum Beispiel den folgenden dirtree:
TEST
/VOL01
file.txt
file.pic
/VOL02
/VOL0201
file.nu
/VOL020101
file.jpg
file.erp
file.gif
/VOL03
/VOL0301
file.org
Geben sollte als Ausgabe:
PS> DirX C:\TEST
Directory Count
----------------------------
VOL01 2
VOL02 0
VOL02/VOL0201 1
VOL02/VOL0201/VOL020101 3
VOL03 0
VOL03/VOL0301 1
Begann ich mit dem folgenden:
Function DirX($directory)
{
foreach ($file in Get-ChildItem $directory -Recurse)
{
Write-Host $file
}
}
Nun habe ich eine Frage: wieso ist meine Funktion nicht recursing?
- Sie ein code-snippet funktioniert wie gedacht, es zeigt mir everyfile unter $Verzeichnis. Die Logik, wie es steht, wird nicht erhalten Sie Ihre gewünschte Ausgabe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas wie dies funktionieren sollte:
dir -recurse
listet alle Dateien im aktuellen Verzeichnis und pipes (|) das Ergebnis zu?{ $_.PSIsContainer }
die Filter der Verzeichnisse, die nur dann Pfeifen Sie wieder die resultierende Liste zu%{ Write-Host $_.FullName (dir $_.FullName | Measure-Object).Count }
was ist eine foreach-Schleife, für jedes Element der Liste (in$_) wird der vollständige name und das Ergebnis des folgenden Ausdrucks(dir $_.FullName | Measure-Object).Count
die eine Liste von Dateien unter $_.FullName Pfad und zählt Mitglieder durch Measure-Object?{ ... }
ist ein alias für Where-Object%{ ... }
ist ein alias für foreach -Ähnlich wie David, der die Lösung dies funktioniert in der Powershell v3.0 und nicht verwendet Aliase für den Fall dass jemand nicht mit Ihnen vertraut
Antwort Ergänzen
Basierend auf einem Kommentar über das halten mit Ihrer Funktion und loop-Struktur, die ich der folgenden. Hinweis: ich nicht dulden diese Lösung, wie es hässlich ist und die eingebauten cmdlets handhaben dies sehr gut. Aber ich mag zu helfen, so dass hier ein update des Skripts.
Für jeden
$singleDirectory
zählen Sie alle Dateien mit$count
( wird zurückgesetzt, bevor der nächste loop ) und Ausgang zu finden, um eine hash-Tabelle. Am Ende der Ausgabe des Hash als string. In Ihrer Frage, Sie sah aus wie Sie wollte, ein Objekt-output-anstelle von geraden text.Gut, die Art und Weise Sie tun es die ganze
Get-ChildItem
cmdlet muss abgeschlossen sein, bevor dieforeach
Schleife kann beginnen Durchlaufen. Sind Sie sicher, dass Sie warten lange genug? Wenn Sie ausführen, dass gegen sehr große Verzeichnisse (z.B. C:) es geht, zu nehmen eine ziemlich lange Zeit.Edit: sah, fragte man früher für ein Weg, um Ihre Funktion tun, was Sie Fragen, hier gehen Sie.
Die foreach-Schleife bekommen nur die Verzeichnisse da, dass ist alles, was wir über Pflege, dann innerhalb der Schleife ein benutzerdefiniertes Objekt erstellt für jede iteration mit den vollständigen Pfad des Ordners und die Anzahl der Elemente innerhalb der Ordner.
Bitte beachten Sie, dass dies nur funktioniert in der PowerShell 3.0 oder höher, da die
-directory
parameter existiert nicht in 2.0VOL01
,VOL02
,VOL03
$file
um etwas anderes. Es repräsentiert ein Verzeichnis und keine Datei. Nicht, dass es wirkt sich auf die Funktionalität des Skripts. +1 wie Sie mit der Objekterstellung besser, als ich es Tat.Meine version - sauberer und speichert die Inhalte in einer Datei
Original - Rekursiv Dateien zählen in Unterordner
Zweite Komponente - Anzahl Elemente in einem Ordner mit der PowerShell
Ich modifiziert David Brabant Lösung nur ein bisschen, so konnte ich beurteilen das Ergebnis: