Arbelac
Arbelac

Reputation: 1904

Count the number of files in the directory as well as the number of folders

Currently , I can export the list to a text file and separate them by share name. My question is : I want to be able to count the number of files in the directory as well as the number of folders into a separate text file.

I'd like to do in this format for text file , $hostname-$sharename-count.txt

For example:

My desired output:

1000    #Folder count
150     #File count

Here is what I have so far:

$outputDir = 'C:\Output'
$Shares    = Get-WmiObject Win32_Share -Filter "not name like '%$'"

$re = ($Shares | ForEach-Object {[Regex]::Escape($_.Path)}) -join '|'
foreach ($Share in $Shares) {
    $result  = (Get-ChildItem -Path $Share.Path -File -Recurse | Select-Object -Expand FullName) -replace "^($re)\\"
    # output the results per share in a text file
    $fileOut = Join-Path -Path $outputDir -ChildPath ('{0}-{1}.txt' -f $env:COMPUTERNAME, $Share.Name)
    $result | Out-File -FilePath $fileOut -Force
}

Upvotes: 1

Views: 120

Answers (3)

Erick Guillen
Erick Guillen

Reputation: 595

You can do this in just one line of code Get-ChildItem | Measure-Object -Property Mode

The property Mode from Get-ChildItem tells you if you are getting folders, files or others.

You can also use get-help Measure-Object -Examples to check some useful examples on measuring files and folders

Upvotes: 0

Theo
Theo

Reputation: 61068

You can simply expand the code you have like below:

$outputDir = 'C:\Output'
$Shares    = Get-WmiObject Win32_Share -Filter "not name like '%$'"

$re = ($Shares | ForEach-Object {[Regex]::Escape($_.Path)}) -join '|'
foreach ($Share in $Shares) {
    $files   = (Get-ChildItem -Path $Share.Path -File -Recurse | Select-Object -Expand FullName) -replace "^($re)\\"
    # output the list of files per share in a text file
    $fileOut = Join-Path -Path $outputDir -ChildPath ('{0}-{1}.txt' -f $env:COMPUTERNAME, $Share.Name)
    $files | Out-File -FilePath $fileOut -Force

    # output the count results for files and folders per share in a text file
    $folders = Get-ChildItem -Path $Share.Path -Directory -Recurse
    $content = 'Folders: {0}{1}Files:   {2}' -f $folders.Count, [Environment]::NewLine, $files.Count
    $fileOut = Join-Path -Path $outputDir -ChildPath ('{0}-{1}-count.txt' -f $env:COMPUTERNAME, $Share.Name)
    $content | Out-File -FilePath $fileOut -Force
}

P.S. You can add switch -Force to the Get-ChildItem cmdlet to also get the hidden or system files listed if there are any such files inside the shares

Upvotes: 2

techguy1029
techguy1029

Reputation: 831

If you just want to have a count, you could do something like this:

$resultForFiles  = (Get-ChildItem -Path $Share.Path -File -Recurse | Select-Object -Expand FullName)
$resultForFolders  = (Get-ChildItem -Path $Share.Path -Directory -Recurse | Select-Object -Expand FullName)
$resultForFiles.Count | Out-File "Path" -Append
$resultForFolders.Count | Out-File "Path" -Append

The -File switch for Get-ChildItem will only get files and the -Directory will only get folders

Upvotes: 0

Related Questions