使用 powershell 搜索 pdf 内容并输出文件列表

使用 powershell 搜索 pdf 内容并输出文件列表

以下是我想做的事情:

我有大量各种格式的文件(大约一万个)。每个文件都可以定义为特定类型(例如:产品说明书、商业计划、报价、演示文稿等)。这些文件没有特定的顺序,也可以看作一个列表。我想按类型创建一个目录。

这个想法是,对于某种格式和某种类型,我知道在文件内容中要查找哪些关键字。我想要一个 powershell 脚本,它基本上执行一系列脚本,查找包含特定关键字的某种格式的所有文件,并将每个列表输出到单独的 csv。这里的关键点是关键字将位于内容中(pdf 的正文、excel 的单元格等),而不是文件名中。到目前为止,我已经尝试了以下方法:

get-childitem -Recurse | where {!$_.PSIsContainer} |
select-object FullName, LastWriteTime, Length, Extension | export-csv -notypeinformation -delimiter '|' -path C:\Users\Uzer\Documents\file.csv  -encoding default

这很好,它为我提供了完整的文件列表,包括文件大小和扩展名。我正在寻找类似的东西,但要按内容进行过滤。有什么想法吗?

编辑:根据下面的解决方案,她的新代码是:

$searchstring = "foo"
$directory = Get-ChildItem -include ('*.pdf') -Path "C:\Users\Uzer\Searchfolder" -Recurse

foreach ($obj in $directory)
{Get-Content $obj.fullname | Where-Object {$_.Contains($searchstring)}| select-object FullName, LastWriteTime, Length, Extension | export-csv -notypeinformation -delimiter '|' -path C:\Users\Uzer\Documents\file2.csv  -encoding default}

但是我收到了一堆这样的错误:

 An object at the specified path C:[blabla]\filename.pdf does not exist, or has been filtered by the -Include or -Exclude parameter.

答案1

Powershell 使用文本编辑器。下面评估每个 pdf 的每一页上的文本以查找关键字,然后将任何匹配项导出到 csv。如果找到匹配项,您可以使用它来重命名文件,将它们移动到分类文件夹等。

编辑:itextsharp 的 Github 页面表明它已停止使用,并链接到Itext7 https://github.com/itext/itext7-dotnet(作为 AGPL/商业软件双重许可,似乎可以免费用于非商业用途。)

Add-Type -Path "C:\path_to_dll\itextsharp.dll"
$pdfs = gci "C:\path_to_pdfs" *.pdf
$export = "C:\path_to_export\export.csv"
$results = @()
$keywords = @('Keyword1','Keyword2','Keyword3')

foreach($pdf in $pdfs) {

    Write-Host "processing -" $pdf.FullName

    # prepare the pdf
    $reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $pdf.FullName

    # for each page
    for($page = 1; $page -le $reader.NumberOfPages; $page++) {
    
        # set the page text
        $pageText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader,$page).Split([char]0x000A)

        # if the page text contains any of the keywords we're evaluating
        foreach($keyword in $keywords) {
            if($pageText -match $keyword) {
                $response = @{
                    keyword = $keyword
                    file = $pdf.FullName
                    page = $page
                }
                $results += New-Object PSObject -Property $response
            }
        }
    }
    $reader.Close()
}

Write-Host ""
Write-Host "done"

$results | epcsv $export -NoTypeInformation

控制台输出:

processing - C:\path_to_pdfs\1.pdf
processing - C:\path_to_pdfs\2.pdf
processing - C:\path_to_pdfs\3.pdf
processing - C:\path_to_pdfs\4.pdf
processing - C:\path_to_pdfs\5.pdf

done
PS C:\>

csv 输出:

keyword    page    file
Keyword2   14      C:\path_to_pdfs\3.pdf
Keyword3   22      C:\path_to_pdfs\3.pdf
Keyword1   6       C:\path_to_pdfs\5.pdf

答案2

如果 PDF 的文件内容已在 Windows Search 中编入索引,则可以查询系统文件系统索引。您可能需要安装 iFilter以确保 Windows 将索引 PDF。但此方法将适用于 pdf、文本文件、xlsx 文件等。

$searchString = "foo"
$searchPath = "C:\Users\Uzer\Searchfolder"
$sql = "SELECT System.ItemPathDisplay, System.DateModified, " +
       "System.Size, System.FileExtension FROM SYSTEMINDEX " +
       "WHERE SCOPE = '$searchPath' AND FREETEXT('$searchstring')"
$provider = "provider=search.collatordso;extended properties=’application=windows’;" 
$connector = new-object system.data.oledb.oledbdataadapter -argument $sql, $provider 
$dataset = new-object system.data.dataset 
if ($connector.fill($dataset)) { $dataset.tables[0] }

答案3

您可以使用它Get-Content在文件中查找特定内容。

例子:

$searchstring = "foo"
$directory = Get-ChildItem -Path C:\temp\ -Recurse

foreach ($obj in $directory)
{Get-Content $obj.fullname | Where-Object {$_.Contains($searchstring)} | # do something...}

使用$searchstring变量提供在文件中搜索的单词。$directory变量是包含将使用搜索字符串进行搜索的文件的目录。

Get-Content可以找到有关 cmdlet 的更多信息这里。

相关内容