
Welcome PowerShell User! This recipe is just one of the hundreds of useful resources contained in the PowerShell Cookbook.
If you own the book already, login here to get free, online, searchable access to the entire book's content.
If not, the Windows PowerShell Cookbook is available at Amazon, or any of your other favourite book retailers. If you want to see what the PowerShell Cookbook has to offer, enjoy this free 90 page e-book sample: "The Windows PowerShell Interactive Shell".
You want to get a list of files that match a specific pattern.
Use the Get-ChildItem cmdlet for both simple and advanced wildcard support:
To find all items in the current directory that match a PowerShell wildcard, supply that wildcard to the Get-ChildItem cmdlet:
Get-ChildItem*.txt
To find all items in the current directory that match a provider-specific filter, supply that filter to the -Filter parameter:
Get-ChildItem-Filter*~2*
To find all items in the current directory that do not match a PowerShell wildcard, supply that wildcard to the -Exclude parameter:
Get-ChildItem-Exclude*.txt
To find all items in subdirectories that match a PowerShell wildcard, use the
-Include and -Recurse parameters, or use the wildcard as part of the -Path parameter:
Get-ChildItem-Include*.txt-RecurseGet-ChildItem*.txt-RecurseGet-ChildItem-Pathc:\temp\*.txt-Recurse
To find all items in subdirectories that match a provider-specific filter, use the
-Filter and -Recurse parameters:
Get-ChildItem-Filter*.txt-Recurse
To find all items in subdirectories that do not match a PowerShell wildcard, use the -Exclude and -Recurse parameters:
Get-ChildItem-Exclude*.txt-Recurse
Use the Where-Object cmdlet for advanced regular expression support:
To find all items with a filename that matches a regular expression, use the Where-Object cmdlet to compare the Name property to the regular expression:
Get-ChildItem|Where-Object{$_.Name-match'^KB[0-9]+\.log$'}
To find all items with a directory name that matches a regular expression, use the Where-Object cmdlet to compare the DirectoryName property to the regular expression:
Get-ChildItem-Recurse|Where-Object{$_.DirectoryName-match'Release'}
To find all items with a directory name or filename that matches a regular expression, use the Where-Object cmdlet to compare the FullName property to the regular expression:
Get-ChildItem-Recurse|Where-Object{$_.FullName-match'temp'}
The Get-ChildItem cmdlet supports wildcarding through three parameters:
PathThe -Path parameter is the first (and default) parameter. While you can enter simple paths such as ., C:\, or D:\Documents, you can also supply paths that include wildcards—such as *, *.txt, [a-z]???.log, or even C:\win*\*.N[a-f]?\F*\v2*\csc.exe.
Include/ExcludeThe -Include and -Exclude parameters act as a filter on wildcarding that happens on the -Path parameter. If you specify the -Recurse parameter, the
-Include and -Exclude wildcards apply to all items returned.
The most common mistake with the -Include parameter comes when you use it against a path with no wildcards. For example, this doesn’t seem to produce the expected results:
Get-ChildItem$env:WINDIR-Include*.log
That command produces no results because you haven’t supplied an item wildcard to the path. Instead, the correct command is:
Get-ChildItem$env:WINDIR\*-Include*.log
Or simply:
Get-ChildItem$env:WINDIR\*.log
FilterThe -Filter parameter lets you filter results based on the provider-specific filtering language of the provider from which you retrieve items. Since PowerShell’s wildcarding support closely mimics filesystem wildcards, and most people use the -Filter parameter only on the filesystem, this seems like a redundant (and equivalent) parameter. A SQL provider, however, would use SQL syntax in its
-Filter parameter. Likewise, an Active Directory provider would use LDAP paths in its -Filter parameter.
It may not be obvious, but the filesystem provider’s filtering language isn’t exactly the same as the PowerShell wildcard syntax. For example, the -Filter parameter doesn’t support character ranges:
PS > Get-ChildItem | Select-Object Name Name ---- A Long File Name With Spaces Also.txt A Long File Name With Spaces.txt PS > Get-ChildItem -Filter "[a-z]*" PS > Get-ChildItem "[a-z]*" | Select-Object Name Name ---- A Long File Name With Spaces Also.txt A Long File Name With Spaces.txt
Provider-specific filtering can often return results far more quickly than the more feature-rich PowerShell wildcards. Because of this, PowerShell internally rewrites your wildcards into a combination of wildcards and provider-specific filtering to give you the best of both worlds!
For more information about PowerShell’s wildcard syntax, type Get-Help about_WildCards.
When you want to perform even more advanced filtering than what PowerShell’s wildcard syntax offers, the Where-Object cmdlet provides infinite possibilities. For example, to exclude certain directories from a search, use the following:
Get-ChildItem-Rec|Where-Object{$_.DirectoryName-notmatch"Debug"}
Or, in a simpler form:
Get-ChildItem-Rec|?DirectoryName-notmatchDebug
For a filter that’s difficult (or impossible) to specify programmatically, use the Out-GridView cmdlet as demonstrated in Recipe 2.4 to interactively filter the output.
Because of PowerShell’s pipeline model, an advanced file set generated by Get-ChildItem automatically turns into an advanced file set for other cmdlets to operate on:
PS > Get-ChildItem -Rec | Where-Object { $_.Length -gt 20mb } |
Sort-Object -Descending Length | Select-FilteredObject |
Remove-Item -WhatIf
What if: Performing operation "Remove File" on Target "C:\temp\backup092.zip".
What if: Performing operation "Remove File" on Target "C:\temp\slime.mov".
What if: Performing operation "Remove File" on Target "C:\temp\hello.mov".
For more information about the Get-ChildItem cmdlet, type Get-Help Get-ChildItem.
For more information about the Where-Object cmdlet, type Get-Help Where-Object.
Recipe 2.4, “Interactively Filter Lists of Objects”