126

I'm trying to write a very simple PowerShell script to give me the total number of items (both files and folders) in a given folder (c:\MyFolder). Here's what I've done:

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

The problem is, that if I have 1 or 0 items, the command does not work---it returns nothing.

Any ideas?

Promise Preston
  • 24,334
  • 12
  • 145
  • 143
HydroPowerDeveloper
  • 3,302
  • 7
  • 31
  • 38
  • This is really old, so here's the quick answer for the old problem: Change your command to `Write-Host @( Get-ChildItem c:\MyFolder ).Count;`. This keeps older versions of Powershell from collapsing/unwrapping the list/array returned by `Get-ChildItem` when there's less than 2 elements in it. – Granger Nov 17 '21 at 19:18

8 Answers8

199

You should use Measure-Object to count things. In this case it would look like:

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

or if that's too long

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

and in PowerShell 4.0 use the measure alias instead of mo

Write-Host (dir c:\MyFolder | measure).Count;
Stanley De Boer
  • 4,921
  • 1
  • 23
  • 31
47

If you need to speed up the process (for example counting 30k or more files) then I would go with something like this..

$filepath = "c:\MyFolder"
$filetype = "*.txt"
$file_count = [System.IO.Directory]::GetFiles("$filepath", "$filetype").Count
dariusw
  • 471
  • 4
  • 2
  • That is an order of magnitude faster! Thanks. I had a folder with over 29K files in it, and this method returned the count as fast as my finger lifted from the RETURN key. – xizdaqrian Aug 06 '15 at 12:55
  • 2
    You can recurse this with `[System.IO.Directory]::GetFiles("$filepath", "$filetype",1)` See [here](https://learn.microsoft.com/en-us/dotnet/api/system.io.directory.getfiles?view=netframework-4.8) – Cody G Aug 05 '19 at 18:12
  • Or filter with regex with `$r = ` and `(Get-ChildItem) -match $r | Select FullName, @{name = "FileCount"; expression = {[System.IO.Directory]::GetFiles($_).Count}}` – pavol.kutaj Mar 27 '21 at 05:03
45

I finally found this link:

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

Well, it turns out that this is a quirk caused precisely because there was only one file in the directory. Some searching revealed that in this case, PowerShell returns a scalar object instead of an array. This object doesn’t have a count property, so there isn’t anything to retrieve.

The solution -- force PowerShell to return an array with the @ symbol:

Write-Host @( Get-ChildItem c:\MyFolder ).Count;
HydroPowerDeveloper
  • 3,302
  • 7
  • 31
  • 38
19

Only Files

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

Only Folders

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

Both

Get-ChildItem D:\ -Recurse | Measure-Object | %{$_.Count}
hdev
  • 6,097
  • 1
  • 45
  • 62
7

You can also use an alias

(ls).Count
Daniel Rodas
  • 91
  • 1
  • 2
3

Recursively count files in directories in PowerShell 2.0

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

In powershell you can to use severals commands, for looking for this commands digit: Get-Alias;

So the cammands the can to use are:

write-host (ls MydirectoryName).Count

or

write-host (dir MydirectoryName).Count

or

write-host (Get-ChildrenItem MydirectoryName).Count
0

To count the number of a specific filetype in a folder. The example is to count mp3 files on F: drive.

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

Tested in 6.2.3, but should work >4.

OrigamiEye
  • 864
  • 1
  • 12
  • 31