1

Вот что я пытаюсь сделать:

У меня огромный беспорядок файлов (около десяти тысяч) различных форматов. Каждый файл может быть определен как определенный тип (например: лист продукта, бизнес-план, предложение, презентация и т.д.). Файлы расположены не в определенном порядке и могут рассматриваться как единый список. Я заинтересован в создании каталога по типу.

Идея заключается в том, что для определенного формата и определенного типа я знаю, какие ключевые слова нужно искать в содержимом файла. Я хотел бы иметь сценарий 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.

3 ответа3

3

Powershell с использованием itextsharp.dll. Ниже приводится оценка текста на каждой странице каждого файла PDF для ключевых слов, а затем выполняется экспорт любых совпадений в CSV. Вы можете запустить это, чтобы переименовать файлы, если совпадения найдены, переместить их в категоризированные папки и тому подобное.

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] }
-1

Вы можете использовать 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 можно найти здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .