Powershell Get-ChildItem -Filter与具有相同值的Where子句的操作方式不同

Kie*_*ies 11 powershell filter get-childitem

我在服务器上有一个名为MyFolder的文件夹.还有一些名为MyFolder.1,MyFolder.2,MyFolder.3等的文件夹.

如果我跑:

gci C:\Sample | ? { $_.Name -like "MyFolder.*" }
Run Code Online (Sandbox Code Playgroud)

我得到了预期的输出:

    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  
Run Code Online (Sandbox Code Playgroud)

但是如果我跑:

gci C:\Sample -Filter "MyFolder.*"
Run Code Online (Sandbox Code Playgroud)

我明白了:

    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                                                                
Run Code Online (Sandbox Code Playgroud)

我对MyFolder如何包含在输出中感到困惑.我希望输出是一样的.

在线帮助突出了过滤器的语法是基于供应商,但我不能确定在这种情况下使用什么样的供应商.

我在这里错过了一个基本的知识吗?我试图将一个正则表达式字符串传递给过滤器,"MyFolder\.*"但这只是没有返回任何内容.我确定我错过了一些简单的事情.

我正在运行Powershell版本2.

解析度

感谢Roman Kuzmin指出了通配符匹配的不同之处.以下给出了预期的输出:

gci C:\Sample\MyFolder.*
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*min 12

Filter文件系统提供的,而使用CMD通配符比PowerShell的通配符.CMD通配符很有趣,在某些边缘情况下并不直观,主要是历史性的.这是一个有趣的解释:http://blogs.msdn.com/b/oldnewthing/archive/2007/12/17/6785519.aspx

另外需要牢记的是:ls -Filter *.txt事实上,获取*.txt*PowerShell意义上的文件,即扩展名以txt 开头的文件.这可能是意料之外的,在某些情况下非常不愉快:)

  • 当文件夹中的一个脚本名为“filename.sql-skip”时,我可以保证使用 -Filter 并针对数据库运行一组 SQL 脚本会产生“意外且令人不快”的效果。 (2认同)

CB.*_*CB. 6

gci C:\Sample -Filter "MyFolder.*"  # here is a filesystem provider; use wildcard `*`,`?`
Run Code Online (Sandbox Code Playgroud)

返回与(在cmd.exe shell中)相同的输出:

dir Myfolder.* 
Run Code Online (Sandbox Code Playgroud)

如果你需要一个正则表达式,这是方式(-filter不接受正则表达式)

gci C:\Sample | ? { $_.Name -match '^MyFolder\..*' }
Run Code Online (Sandbox Code Playgroud)

像这儿

gci C:\Sample | ? { $_.Name -like "MyFolder.*" }
Run Code Online (Sandbox Code Playgroud)

scriptblock中的比较是在[string]类型之间.