Thursday, December 1, 2011

PowerShell - count folders in folders

Counting the number of files in a directory is easy
Here's a more complex example that I will break down, like a tutorial. Unlike the previous example, this is taking advantage of the object oriented nature of PowerShell. You should understand about_pipelines before you continue reading

The problem
An invoice scanning system uploads files to a file server. The directory structure is the following.

Here's an German invoice folder scanned on December 1st 2011

The question is : "How many invoices have been created every day by country ?" . The output has to be a table to be analyzed with Excel.

The proposed solution

Get all the country folders
dir \\server\files\*-invoices
For each (% is the operator) country folder ($_ is the pipeline object), display only its name
dir \\server\files\*-invoices | %{$_.Name}
Display the date folders for each country
dir \\server\files\*-invoices | %{dir $_}
We'll store the country name in $country, to use it later as we bring it up the pipeline.
dir \\server\files\*-invoices | %{$country=$_.Name}

Now it's getting a bit tricky.We'll put a pipeline inside a pipeline!
Because we need to process each date folder in each country folder.

  • For Each country folder display its name
  • For Each date folder in a country folder display its name
  • For Each date folder, count the number of folders it contains

Display the country name and the date folder

dir \\server\files\*-invoices | %{$country=$_.Name;dir $_ |%{Write-Host $country $_.Name}}
DE-invoices 2011-12-01
DE-invoices 2011-11-30

Display the folder count
dir \\server\files\*-invoices | %{$country=$_.Name;dir $_ |%{Write-Host $country $_.Name (dir $_).count}}


DE-invoices 2011-12-01 5
DE-invoices 2011-11-30 18

The result can now be imported as CSV file ,using the space character as the separator.

1 comment:

  1. Hope you will keep on sharing such information here..Very needed information you have shared..Thanks!