Подсчет элементов в папке с помощью PowerShell


Я пытаюсь написать очень простой сценарий PowerShell, чтобы дать мне общее количество элементов (как файлов, так и папок) в данной папке (c:MyFolder). Вот что я сделал:

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

Проблема в том, что если у меня есть 1 или 0 элементов, команда не работает-она ничего не возвращает.

Есть идеи?

6 53

6 ответов:

Вы должны использовать Measure-Object для подсчета вещей. В этом случае это выглядело бы так:

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

Или если это слишком долго

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

И в PowerShell 4.0 используйте псевдоним measure вместо mo

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

Я наконец нашел эту ссылку:

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

Ну, получается, что это причуда, вызванная именно тем, что там в каталоге был только один файл. Некоторые поиски показали, что в в этом случае PowerShell возвращает скалярный объект вместо массива. Этот объект не имеет свойства count, поэтому ему нечего делать. извлекать.

Решение -- сила PowerShell возвращает массив с символом @:

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

Если вам нужно ускорить процесс (например, подсчет 30k или более файлов), то я бы пошел с чем-то вроде этого..

$filepath = "c:\MyFolder"
$filetype = "*.txt"
$file_count = [System.IO.Directory]::GetFiles("$filepath", "$filetype").Count

Только Файлы

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

Только Папки

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

Оба

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

Рекурсивно подсчитывать файлы в каталогах в PowerShell 2.0

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

В powershell вы можете использовать несколько команд, для поиска этой команды цифра: Get-Alias;

Итак, cammands, которые можно использовать:

write-host (ls MydirectoryName).Count

Или

write-host (dir MydirectoryName).Count

Или

write-host (Get-ChildrenItem MydirectoryName).Count