我在名为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.*
将来,我将轻松使用此语法以减少代码中的噪音。
最佳答案
FileSystem提供程序的Filter
宁愿使用CMD通配符,也不使用PowerShell通配符。 CMD通配符很有趣,在某些极端情况下(通常是历史记录)并不直观。这是一个有趣的解释:https://devblogs.microsoft.com/oldnewthing/20071217-00/?p=24143
需要牢记的另一个陷阱:实际上,ls -Filter *.txt
获取的文件类似于PowerShell中的*.txt*
,即扩展名为的文件以txt开头的。在某些情况下,这可能是意外的,并且非常不愉快:)
关于powershell - Powershell Get-ChildItem -Filter与具有相同值的Where子句的操作不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12913734/