Contar elementos en una carpeta con PowerShell


Estoy tratando de escribir un script de PowerShell muy simple para darme el número total de elementos (tanto archivos como carpetas) en una carpeta dada (c:\MyFolder). Esto es lo que he hecho:

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

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

¿Alguna idea?

Author: HydroPowerDeveloper, 2013-02-05

6 answers

Debes usar Measure-Object para contar cosas. En este caso se vería como:

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 alias measure en lugar de mo

Write-Host (dir c:\MyFolder | measure).Count;
 89
Author: Stanley De Boer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-22 18:58:35

Finalmente encontré este enlace:

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

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

La solución force fuerza PowerShell para devolver un array con el símbolo @:

Write-Host @( Get-ChildItem c:\MyFolder ).Count;
 25
Author: HydroPowerDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-05 18:40:04

Si necesitas acelerar el proceso (por ejemplo contando 30k o más archivos) entonces yo iría con algo como esto..

$filepath = "c:\MyFolder"
$filetype = "*.txt"
$file_count = [System.IO.Directory]::GetFiles("$filepath", "$filetype").Count
 18
Author: dariusw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-13 05:48:22

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}
 5
Author: dh_cgn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-13 12:22:02

Contar recursivamente archivos en directorios en PowerShell 2.0

ls -rec | ? {$_.mode -match 'd'} | select FullName,  @{N='Count';E={(ls $_.FullName | measure).Count}}
 1
Author: Valeriy Glushenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 23:01:02

En powershell puede usar varios comandos, para buscar este dígito de comandos: Get-Alias;

Así que los cammands que se pueden usar son:

write-host (ls MydirectoryName).Count

O

write-host (dir MydirectoryName).Count

O

write-host (Get-ChildrenItem MydirectoryName).Count
 0
Author: Fábio Rodrigues Fonseca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 19:33:14