我在名为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/

10-13 07:46
查看更多