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?
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;
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;
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
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}
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}}
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
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