Powershell Get-ChildItem -Filter与具有相同值的Where子句的操作方式不同

时间:2012-10-16 11:29:56

标签: powershell filter get-childitem

我在名为MyFolder的服务器上有一个文件夹。还有其他名为MyFolder.1,MyFolder.2,MyFolder.3等的文件夹。

如果我跑:

gci C:\Sample | ? { $_.Name -like "MyFolder.*" }

我得到了预期的输出:

    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  

但是,如果我跑:

gci C:\Sample -Filter "MyFolder.*"

我明白了:

    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                                                                

我对如何在输出中包含 MyFolder 感到困惑。我希望输出是一样的。

online help强调过滤器的语法基于提供程序,但我不确定在此实例中使用了哪个提供程序。

我在这里错过了一个基本的知识吗?我试图将一个正则表达式字符串传递给过滤器,例如"MyFolder\.*",但这根本不会返回任何内容。我确定我错过了一些简单的事情。

我正在运行Powershell版本2.

分辨率

感谢Roman Kuzmin指出了通配符匹配的不同之处。以下给出了预期的输出:

gci C:\Sample\MyFolder.*

我将来会使用这种语法来减少代码中的噪音。

2 个答案:

答案 0 :(得分:11)

FileSystem提供程序的Filter使用CMD通配符而不是PowerShell通配符。 CMD通配符很有趣,在某些边缘情况下并不直观,主要是历史性的。这是一个有趣的解释:http://blogs.msdn.com/b/oldnewthing/archive/2007/12/17/6785519.aspx

要记住另一个问题:ls -Filter *.txt实际上在PowerShell意义上获取了*.txt*这样的文件,即带有 txt 的扩展开始的文件>。在某些情况下,这可能是意外的并且非常不愉快:)

答案 1 :(得分:6)

gci C:\Sample -Filter "MyFolder.*"  # here is a filesystem provider; use wildcard `*`,`?`

返回与(在cmd.exe shell中)相同的输出:

dir Myfolder.* 

如果你需要一个正则表达式(-filter不接受正则表达式)

gci C:\Sample | ? { $_.Name -match '^MyFolder\..*' }

喜欢这里

gci C:\Sample | ? { $_.Name -like "MyFolder.*" }

scriptblock中的比较介于[string]类型之间。