18

我在名为 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如何包含在输出中感到困惑。我希望输出是相同的。

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

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

我正在运行 Powershell 版本 2。

解析度

感谢 Roman Kuzmin 指出通配符匹配的差异。以下给出了预期的输出:

gci C:\Sample\MyFolder.*

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

4

2 回答 2

22

FileSystem 提供程序使用 CMD 通配符而Filter不是 PowerShell 通配符。CMD 通配符在某些边缘情况下很有趣且不直观,主要是在历史上。这是一个有趣的解释:https ://devblogs.microsoft.com/oldnewthing/20071217-00/?p=24143

另一个需要牢记的问题:ls -Filter *.txt实际上获取*.txt*PowerShell 意义上的文件,即扩展名以txt开头的文件。在某些情况下,这可能是出乎意料且非常不愉快的 :)

于 2012-10-16T12:24:13.837 回答
10
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.*" }

脚本块中的比较是[string]类型之间的。

于 2012-10-16T12:06:48.070 回答