如何搜索多个文件的多个文件

时间:2016-05-26 21:03:08

标签: powershell

我有一个我需要搜索的超过500个字符串的列表。 (他们的网址,如果重要的话。)我的网站有超过1,000个网页。我想搜索每个网页,找到每个链接到的网址。

当我们的网站在Unix机器上时,我会用find和grep写一个小的shell脚本来完成这个,但是现在我们在Windows机器上,所以'不是一个真正的选择。我根本没有使用PowerShell的经验,但我怀疑这是我需要的。但是,我不知道如何开始。

理想情况下,我想最终得到的是这样的:

<filename 1>
    <1st string found>
    <2nd string found>
    <3rd string found>
<filename 2>
    <1st string found>
    <2nd string found>

我不需要知道行号;我只需要知道哪些URL在哪些文件中。 (我们将把所有500多个目标网址移动到新的位置,因此我们必须手动更新1,000多个网页中的链接。这将是一个巨大的痛苦。)

大概逻辑是这样的:

for each file {
    print the filename
    for each string {
        if string found in file {
            print the string
        }
    }
}

我们无法直接进行查找/替换,因为网页位于内容管理系统中。我们所能做的就是找到需要更新的页面(使用本地驱动器上的网页的静态副本),然后手动更新CMS中的各个页面。

我希望这很容易做到,但我对PowerShell的完全不熟悉意味着我不知道从哪里开始。任何帮助将不胜感激!

更新

感谢Travis Plunk的帮助!根据他的回答,这是我将要使用的代码的最终版本。

# Strings to search for
$strings = @(
    'http://www.ourwebsite.com/directory/somefile.pdf'
    'http://www.ourwebsite.com/otherdirectory/anotherfile.pdf'
    'http://www.otherwebsite.com/directory/otherfile.pdf'
)

# Directory containing web site files
cd \OurWebDirectory

$results = @(foreach($string in $strings)
{
    Write-Host "Searching files for $string"
    # Excluding the images directory
    dir . -Recurse -Exclude \imagedir | Select-String -SimpleMatch $string 
}) | Sort-Object -Property path

$results | Group-Object -Property path | %{
    "File: $($_.Name)"
    $_.Group | %{"`t$($_.pattern)"}
}

1 个答案:

答案 0 :(得分:2)

这非常接近你想要的。

# Strings to search for
$strings = @(
    'string1'
    'string2'
    )

$results = @(foreach($string in $strings)
    {
        # Be sure to update path to search and file search pattern
        dir .\testdir\*.* -Recurse | Select-String -SimpleMatch $string   
    } 
) | Sort-Object -Property path

$results | Select-Object 'path', 'pattern', 'LineNumber'

示例输出

Path                             Pattern LineNumber
----                             ------- ----------
C:\Users\travi\testdir\test1.txt string1          1
C:\Users\travi\testdir\test1.txt string2          2
C:\Users\travi\testdir\test2.txt string1          2
C:\Users\travi\testdir\test2.txt string2          1

您可以将line添加到`select-object&#39;声明打印整行。

要使输出更像您要求此代码打印结果的内容:

$results | Group-Object -Property path | %{
    "File: $($_.Name)"
    $_.Group | %{"`t$($_.linenumber):$($_.line)"}
}

会给出这样的输出:

File: C:\Users\travi\testdir\test1.txt
    1:string1
    2:string2
File: C:\Users\travi\testdir\test2.txt
    2:string1
    1:string2