我的服务器上有一个名为 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.*"
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
我很困惑如何MyFolder包含在输出中。我希望输出是相同的。
The 网上帮助 http://technet.microsoft.com/library/hh849800.aspx强调过滤器的语法基于提供程序,但我不确定此实例中使用的提供程序。
我在这里错过了一个基本知识吗?我尝试将正则表达式字符串传递给过滤器,例如"MyFolder\.*"
但这根本没有返回任何内容。我确信我错过了一些简单的事情。
我正在运行 Powershell 版本 2。
解决
感谢 Roman Kuzmin 指出通配符匹配的差异。下面给出了预期的输出:
gci C:\Sample\MyFolder.*
将来我将使用这种语法来减少代码中的噪音。
The Filter
FileSystem 提供程序宁愿使用 CMD 通配符而不是 PowerShell 通配符。 CMD 通配符在某些边缘情况下很有趣且不直观,主要是历史上的情况。这是一个有趣的解释:https://devblogs.microsoft.com/oldnewthing/20071217-00/?p=24143 https://devblogs.microsoft.com/oldnewthing/20071217-00/?p=24143
另一个需要记住的问题:ls -Filter *.txt
事实上得到像这样的文件*.txt*
在 PowerShell 意义上,即带有扩展名的文件starting with txt。在某些情况下,这可能是意想不到的并且非常不愉快:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)