Contar elementos en una carpeta con PowerShell

92

Estoy tratando de escribir un script de PowerShell muy simple para darme la cantidad total de elementos (tanto archivos como carpetas) en una carpeta determinada ( c:\MyFolder). Esto es lo que hice:

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

El problema es que si tengo 1 o 0 elementos, el comando no funciona --- no devuelve nada.

¿Algunas ideas?

Desarrollador HydroPower
fuente

Respuestas:

151

Deberías usar Measure-Objectpara contar cosas. En este caso, se vería así:

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

o si eso es demasiado largo

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

y en PowerShell 4.0 use el measurealias en lugar demo

Write-Host (dir c:\MyFolder | measure).Count;
Stanley De Boer
fuente
¿Cómo contar todas las carpetas dentro de una carpeta en particular?
Mihir
38

Finalmente encontré este enlace:

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

Bueno, resulta que esto es un capricho causado precisamente porque solo había un archivo en el directorio. Algunas búsquedas revelaron que, en este caso, PowerShell devuelve un objeto escalar en lugar de una matriz. Este objeto no tiene una propiedad de recuento, por lo que no hay nada que recuperar.

La solución: obligar a PowerShell a devolver una matriz con el @símbolo:

Write-Host @( Get-ChildItem c:\MyFolder ).Count;
Desarrollador HydroPower
fuente
5
Perfecto gracias. Me resulta molesto cuando los commandlets intentan ser "útiles" y varían su tipo de retorno.
Paul Suart
35

Si necesita acelerar el proceso (por ejemplo, contar 30k o más archivos), optaría por algo como esto ...

$filepath = "c:\MyFolder"
$filetype = "*.txt"
$file_count = [System.IO.Directory]::GetFiles("$filepath", "$filetype").Count
dariusw
fuente
¡Eso es un orden de magnitud más rápido! Gracias. Tenía una carpeta con más de 29K archivos, y este método devolvió el recuento tan rápido como mi dedo se levantó de la tecla RETURN.
xizdaqrian
2
Puede recurrir a esto con [System.IO.Directory]::GetFiles("$filepath", "$filetype",1)Vea aquí
Cody G
14

Solo archivos

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

Solo carpetas

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

Ambos

Get-ChildItem D:\ -Recurse | Measure-Object | %{$_.Count}
hdev
fuente
2
En el primero, ¿cómo buscaría todos los archivos jpg y png?
Al Lelopath
4
@AlLelopathGet-ChildItem D:\ -Recurse -File -Include *.jpg,*.png | Measure-Object | %{$_.Count}
hdev
hola @dhcgn cualquier consejo sobre esto stackoverflow.com/questions/54916917/…
rickyProgrammer
1

Contar archivos de forma recursiva en directorios en PowerShell 2.0

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

En PowerShell se puede utilizar comandos severals, para buscar este dígito comandos: Get-Alias;

Entonces, los comandos de cámara que puede usar son:

write-host (ls MydirectoryName).Count

o

write-host (dir MydirectoryName).Count

o

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

Para contar el número de un tipo de archivo específico en una carpeta. El ejemplo es contar archivos mp3 en la unidad F :.

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

Probado en 6.2.3, pero debería funcionar> 4.

OrigamiOjo
fuente