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

92

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

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

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

Любые идеи?

HydroPowerDeveloper
источник

Ответы:

151

Вы должны использовать 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;
Стэнли де Бур
источник
Как подсчитать количество всех папок внутри определенной папки?
Mihir
38

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

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

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

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

Write-Host @( Get-ChildItem c:\MyFolder ).Count;
HydroPowerDeveloper
источник
5
Отлично, спасибо. Меня раздражает, когда командлеты пытаются быть «полезными» и меняют свой тип возвращаемого значения.
Paul Suart
35

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

$filepath = "c:\MyFolder"
$filetype = "*.txt"
$file_count = [System.IO.Directory]::GetFiles("$filepath", "$filetype").Count
Dariusw
источник
Это на порядок быстрее! Спасибо. У меня была папка с более чем 29 КБ файлов, и этот метод возвращал счет так же быстро, как мой палец убирался с клавиши RETURN.
xizdaqrian
2
Вы можете повторить это с помощью [System.IO.Directory]::GetFiles("$filepath", "$filetype",1)See here
Cody G
14

Только файлы

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

Только папки

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

И то и другое

Get-ChildItem D:\ -Recurse | Measure-Object | %{$_.Count}
hdev
источник
2
На первом, как мне искать все файлы jpg и png?
Al Lelopath
4
@AlLelopathGet-ChildItem D:\ -Recurse -File -Include *.jpg,*.png | Measure-Object | %{$_.Count}
hdev
привет @dhcgn, любой совет по этому stackoverflow.com/questions/54916917/…
rickyProgrammer
1

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

ls -rec | ? {$_.mode -match 'd'} | select FullName,  @{N='Count';E={(ls $_.FullName | measure).Count}}
Валерий Глушенков
источник
1

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

Итак, можно использовать следующие команды:

write-host (ls MydirectoryName).Count

или

write-host (dir MydirectoryName).Count

или

write-host (Get-ChildrenItem MydirectoryName).Count
Фабио Родригес Фонсека
источник
0

Для подсчета количества файлов определенного типа в папке. Пример - подсчет mp3-файлов на диске F :.

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

Проверено в 6.2.3, но должно работать> 4.

ОригамиГлаз
источник