将Get-Childitem管道化为SelectString可选择文件内容而不是文件名

时间:2016-04-05 15:23:06

标签: powershell pipeline

我试图在Powershell中执行相当于linux命令find . | grep [search_string]

当我致电Get-ChildItem -recurse | Select-String [search_string]时,它会匹配文件的内容,而不仅仅是我想要匹配的文件名。

如何只查看文件名?

3 个答案:

答案 0 :(得分:2)

首先展开文件对象的NameFullName属性:

Get-ChildItem -Recurse |
    Select-Object -Expand FullName |
    Select-String [search_string]

要获取匹配项的全名,请展开生成的Line对象的MatchInfo属性:

Get-ChildItem -Recurse |
    Select-Object -Expand FullName |
    Select-String [search_string] |
    Select-Object -Expand Line

或使用Where-Object过滤器代替Select-Object

Get-ChildItem -Recurse |
    Select-Object -Expand FullName |
    Where-Object { $_ -match [search_string] }

答案 1 :(得分:0)

更好的用法是使用Where-Object cmdlet,然后只匹配文件名。

例如,假设您有一个这样的目录,并且您只想在名称中获取带有ham的文件。

Directory: T:\stack


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         4/5/2016  11:28 AM                cat-1
d-----         4/5/2016  11:28 AM                cat-2
d-----         4/5/2016  11:28 AM                cat-3
d-----         4/5/2016  11:28 AM                cat-4
d-----         4/5/2016  11:28 AM                cat-5
d-----         4/5/2016  11:28 AM                dog-1
d-----         4/5/2016  11:28 AM                dog-2
d-----         4/5/2016  11:28 AM                dog-3

使用此语法Dir | Where-Object Name -like *string*,您可以轻松找到匹配的文件或文件夹:

dir | ? Name -like ham*


    Directory: T:\stack


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         4/5/2016  11:28 AM                ham-1
d-----         4/5/2016  11:28 AM                ham-2
d-----         4/5/2016  11:28 AM                ham-3
d-----         4/5/2016  11:28 AM                ham-4
d-----         4/5/2016  11:28 AM                ham-5

答案 2 :(得分:0)

function locate{
    param(
        [Parameter(Mandatory=$False,Position=2)]
        [string] $loc = '.',
        [Parameter(Mandatory=$True,Position=1)]
        [string] $search
    )
    (gci $loc -Recurse).FullName | Select-String $search
}

用法

PS C:\Users\username\Documents> locate somefile

C:\Users\username\Documents\somefile.csv

PS C:\Users\username\Documents> locate somefile ..

C:\Users\username\Documents\somefile.csv
C:\Users\username\Downloads\somefile.txt
C:\Users\username\Pictures\somefile.pst