Reputation: 747
I have a folder on a server called MyFolder. There are additional folders called MyFolder.1, MyFolder.2, MyFolder.3 etc.
If I run:
gci C:\Sample | ? { $_.Name -like "MyFolder.*" }
I get the expected output:
Directory: C:\Sample
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 16/10/2012 12:16 MyFolder.1
d---- 16/10/2012 12:16 MyFolder.2
d---- 16/10/2012 12:16 MyFolder.3
However if I run:
gci C:\Sample -Filter "MyFolder.*"
I get:
Directory: C:\Sample
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 16/10/2012 12:16 MyFolder
d---- 16/10/2012 12:16 MyFolder.1
d---- 16/10/2012 12:16 MyFolder.2
d---- 16/10/2012 12:16 MyFolder.3
I'm confused on how MyFolder is included in the output. I'd expect the output to be the same.
The online help highlights that the syntax of the filter is based on the provider but I'm unsure what provider is being used in this instance.
Am I missing a fundamental piece of knowledge here? I've attempted to pass a regex string in to the filter e.g "MyFolder\.*"
but this simply returns nothing. I'm sure I'm missing something simple.
I'm running Powershell version 2.
Thanks to Roman Kuzmin for pointing out the differences in wildcard matching. The following gives the expected output:
gci C:\Sample\MyFolder.*
I'll be using this syntax for ease in the future to reduce noise in code.
Upvotes: 23
Views: 74859
Reputation: 75
here is some info on filter behavior https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7.3
MS example.
Get-ChildItem -Path C:\Test\ -Include *.txt
Get-ChildItem -Path C:\Test* -Include *.txt
Directory: C:\Test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2/13/2019 08:55 26 anotherfile.txt
-a---- 2/12/2019 15:40 118014 Command.txt
-ar--- 2/12/2019 14:31 27 ReadOnlyFile.txt
Upvotes: 0
Reputation: 42035
The Filter
of FileSystem provider rather uses CMD wildcards than PowerShell wildcards. CMD wildcards are funny and not intuitive in some edge cases, mostly historically. Here is an interesting explanation: https://devblogs.microsoft.com/oldnewthing/20071217-00/?p=24143
Another gotcha to be kept in mind: ls -Filter *.txt
in fact gets files like *.txt*
in PowerShell sense, i.e. files with extensions starting with txt. This may be unexpected and very unpleasant in some scenarios :)
Upvotes: 26
Reputation: 60910
gci C:\Sample -Filter "MyFolder.*" # here is a filesystem provider; use wildcard `*`,`?`
return the same output as (in a cmd.exe shell):
dir Myfolder.*
If you need a regex this is the way ( -filter
doesn't accept regex)
gci C:\Sample | ? { $_.Name -match '^MyFolder\..*' }
like here
gci C:\Sample | ? { $_.Name -like "MyFolder.*" }
the comparison in the scriptblock is between [string]
type.
Upvotes: 12