Compter les éléments dans un dossier avec PowerShell

91

J'essaie d'écrire un script PowerShell très simple pour me donner le nombre total d'éléments (fichiers et dossiers) dans un dossier donné ( c:\MyFolder). Voici ce que j'ai fait:

Write-Host ( Get-ChildItem c:\MyFolder ).Count;

Le problème est que si j'ai 1 ou 0 éléments, la commande ne fonctionne pas - elle ne renvoie rien.

Des idées?

HydroPowerDéveloppeur
la source

Réponses:

148

Vous devriez utiliser Measure-Objectpour compter les choses. Dans ce cas, cela ressemblerait à:

Write-Host ( Get-ChildItem c:\MyFolder | Measure-Object ).Count;

ou si c'est trop long

Write-Host ( dir c:\MyFolder | mo).Count;

et dans PowerShell 4.0, utilisez l' measurealias au lieu demo

Write-Host (dir c:\MyFolder | measure).Count;
Stanley De Boer
la source
Comment obtenir le nombre de tous les dossiers dans un dossier particulier?
Mihir
37

J'ai enfin trouvé ce lien:

https://blogs.perficient.com/microsoft/2011/06/powershell-count-property-returns-nothing/

Eh bien, il s'avère que c'est une bizarrerie causée précisément parce qu'il n'y avait qu'un seul fichier dans le répertoire. Certaines recherches ont révélé que dans ce cas, PowerShell renvoie un objet scalaire au lieu d'un tableau. Cet objet n'a pas de propriété count, il n'y a donc rien à récupérer.

La solution - force PowerShell à renvoyer un tableau avec le @symbole:

Write-Host @( Get-ChildItem c:\MyFolder ).Count;
HydroPowerDéveloppeur
la source
5
Parfait merci. Je trouve cela ennuyeux quand les commandlets essaient d'être "utiles" et varient leur type de retour.
Paul Suart
34

Si vous avez besoin d'accélérer le processus (par exemple en comptant 30k fichiers ou plus), j'irais avec quelque chose comme ça.

$filepath = "c:\MyFolder"
$filetype = "*.txt"
$file_count = [System.IO.Directory]::GetFiles("$filepath", "$filetype").Count
Dariusw
la source
C'est un ordre de grandeur plus rapide! Merci. J'avais un dossier avec plus de 29K fichiers, et cette méthode a renvoyé le décompte aussi vite que mon doigt soulevé de la touche RETURN.
xizdaqrian
1
Vous pouvez le répéter avec [System.IO.Directory]::GetFiles("$filepath", "$filetype",1)Voir ici
Cody G
14

Seuls les fichiers

Get-ChildItem D:\ -Recurse -File | Measure-Object | %{$_.Count}

Seuls les dossiers

Get-ChildItem D:\ -Recurse -Directory | Measure-Object | %{$_.Count}

Tous les deux

Get-ChildItem D:\ -Recurse | Measure-Object | %{$_.Count}
dhcgn
la source
2
Sur le premier, comment rechercherais-je tous les fichiers jpg et png?
Al Lelopath le
4
@AlLelopathGet-ChildItem D:\ -Recurse -File -Include *.jpg,*.png | Measure-Object | %{$_.Count}
dhcgn
salut @dhcgn des conseils sur ce stackoverflow.com/questions/54916917/…
rickyProgrammer
1

Compter récursivement les fichiers dans les répertoires dans PowerShell 2.0

ls -rec | ? {$_.mode -match 'd'} | select FullName,  @{N='Count';E={(ls $_.FullName | measure).Count}}
Valeriy Glushenkov
la source
1

En Powershell vous pouvez utiliser les commandes severals, pour la recherche de ce chiffre des commandes: Get-Alias;

Donc, les cammands que vous pouvez utiliser sont:

write-host (ls MydirectoryName).Count

ou

write-host (dir MydirectoryName).Count

ou

write-host (Get-ChildrenItem MydirectoryName).Count
Fábio Rodrigues Fonseca
la source
0

Pour compter le nombre d'un type de fichier spécifique dans un dossier. L'exemple consiste à compter les fichiers mp3 sur le lecteur F:.

( Get-ChildItme F: -Filter *.mp3 - Recurse | measure ).Count

Testé en 6.2.3, mais devrait fonctionner> 4.

OrigamiEye
la source