5

I'm new to PowerShell and have a question on the following behaviour. I'm trying to count the number of files in a directory of a certain type. If there are some, I will then copy them elsewhere. Here's the output of my test folder; the code is modified from MSDN examples I found:

[PS]> Get-ChildItem c:\pstdump

Directory: C:\pstdump

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2/12/2011   9:48 AM          0 blah.pst
-a---         2/12/2011   9:36 AM          0 New Text Document.txt
-a---         2/12/2011   9:36 AM         20 New WinRAR archive.rar

[PS]> (Get-ChildItem c:\pstdump).Count
3
[PS]>

All well and good; PowerShell and I are in agreeance that there are 3 files in the folder. Now when I'd like to pick particular file types (for example .PST files):

[PS]> Get-ChildItem c:\pstdump -filter "*.pst"

Directory: C:\pstdump

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2/12/2011   9:48 AM          0 blah.pst

[PS]> (Get-ChildItem c:\pstdump -filter "*.pst").Count
[PS]>

The '.Count' is returning nothing even though the filter should be returning 1 file. I consider this an incorrect count...

Could someone please explain why this 'incorrect' .Count is being returned?

Alternatively, please feel free to berate me for the obvious n00b mistake I must be making.

Thanks!

2 Answers 2

6

Call it a quirk or a feature, but this has to do with how PowerShell deals with lists that are only 1 in length. It "flattens" them so that it is no longer a list, but a single FileInfo object. Since the FileInfo object doesn't have a Count property, you get no result. There are a couple of ways to work around this:

  1. Force the value returned to remain as an array, by wrapping it in the array operator @():

    @(Get-ChildItem c:\pstdump -filter "*.pst").Count
    
  2. Use the Measure-Object cmdlet:

    (Get-ChildItem c:\pstdump -filter "*.pst" | measure).Count
    
1
  • Brilliant! Just slapped the '@' in front and the array count is working as expected. Thanks for the answer!
    – Beeblebrox
    Dec 2, 2011 at 5:31
0

I was trying to get the number of file types within a directory to decide whether to process the folder or not.

While the above works, a better solution may be to use Test-Path to check for the existance of specific files or file types.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .