Search code examples
powershellcsvget-childitem

How can I count files in folder and subfolder using Powershell


I am trying to count all files in subfolder and extract to csv. Here is the file structure.

C:\TEST\FolderAAA

  |-folderA1
     |-folderA1.1
        |-file
        |-file
     |-folderA1.2
        |-file
        |-file
     |-folderA1.3
        |-file
        |-file

   |-folderA2
     |-folderA1.1
        |-file
        |-file
     |-folderA2.2
        |-file
        |-file
     |-folderA2.3
        |-file
        |-file

C:\TEST\FolderBBB

  |-folderB1
     |-folderB1.1
        |-file
        |-file
     |-folderB1.2
        |-file
        |-file
     |-folderB1.3
        |-file
        |-file

   |-folderB2
     |-folderB2.1
        |-file
        |-file
     |-folderB2.2
        |-file
        |-file
     |-folderB3.3
        |-file
        |-file

C:\TEST\FolderCCC

  |-folderC1
     |-folderC1.1
        |-file
        |-file
     |-folderC1.2
        |-file
        |-file
     |-folderC1.3
        |-file
        |-file

   |-folderC2
     |-folderC2.1
        |-file
        |-file
     |-folderC2.2
        |-file
        |-file
     |-folderC3.3
        |-file
        |-file

I am looking for a CSV output with the below format:

Column A          Column B
Folders           File Count
----------------------------
FolderAAA                   0
folderA1                    0
folderA1.1                  2
folderA1.2                  2
folderA1.3                  2
folderA2                    0
folderA2.1                  2
folderA2.2                  2
folderA2.3                  2

Space/New Blank Row --------

FolderBBB                   0
folderB1                    0
folderB1.1                  2
folderB1.2                  2
folderB1.3                  2
folderB2                    0
folderB2.1                  2
folderB2.2                  2
folderB2.3                  2

Space/New Blank Row --------

FolderCCC                   0
folderC1                    0
folderC1.1                  2
folderC1.2                  2
folderC1.3                  2
folderC2                    0
folderC2.1                  2
folderC2.2                  2
folderC2.3                  2

I tried and modified this code that I found after doing some research here:

$FOLDER_ROOT = "C:\TEST\"
$OUTPUT_LOCATION = "C:\TEST\RESULT\Folder_Count.txt"
$OUTPUT_CSV = "C:\TEST\RESULT\Folder_Count.csv"

function DirX($directory) {
    Remove-Item $OUTPUT_LOCATION

    foreach ($singleDirectory in (Get-ChildItem $directory -Recurse -Directory)) {
        $count = Get-ChildItem $singleDirectory.FullName -File |
                 Measure-Object |
                 %{$_.Count}
        $summary = $singleDirectory.Basename + " - " + $count
        Add-Content $OUTPUT_LOCATION $summary
    }
}
DirX($FOLDER_ROOT)

Import-Csv $OUTPUT_LOCATION -Delimiter "-" -Header Folder, Count |
    Export-Csv $OUTPUT_CSV -NoTypeInformation

The extract I am getting does not format according to what I am trying to achieve.

Currently the extract is formatted incorrectly this way:

Column A          Column B
Folders           File Count
----------------------------
FolderAAA                  0
folderA1                   0
folderA2                   0
folderA1.1                 2
folderA1.2                 2
folderA1.3                 2
folderA2.1                 2
folderA2.2                 2
folderA2.3                 2

Solution

  • I concur with @Scepticalist's suggested approach, but would recommend streamlining it into a pipeline, like this:

    Get-ChildItem $FOLDER_ROOT -Recurse -Directory |
        Sort-Object FullName |
        Select-Object FullName, @{n='Count';e={(Get-ChildItem $_.FullName -File).Count}} |
        Export-Csv -Path $OUTPUT_CSV -NoType