我在名为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.*
我将来会使用这种语法来减少代码中的噪音。
答案 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]
类型之间。