Объединение выходных данных из папки

#powershell

Вопрос:

У меня есть тысячи PDF-документов, которые я пытаюсь просмотреть и извлечь только определенные данные. Я успешно создал скрипт, который просматривает каждый PDF-файл, помещает его содержимое в файл .txt, а затем в конечном файле .txt выполняется поиск запрошенной информации. Единственная часть, на которой я застрял, — это попытка объединить все данные из каждого PDF-файла в этот файл .txt. В настоящее время каждый последующий PDF-файл просто перезаписывает предыдущие данные, и поиск выполняется только в последнем PDF-файле в папке. Как я могу изменить этот набор кода, чтобы каждый бит информации можно было объединить в файл .txt вместо перезаписи?

  $all = Get-Childitem -Path $file1 -Recurse -Filter *.pdf
    foreach ($f in $all){
        $outfile = -join ', '
        $text = convert-PDFtoText $outfile
    }
 

Вот весь мой сценарий для справки:

 Start-Process powershell.exe -Verb RunAs {

function convert-PDFtoText {
    param(
        [Parameter(Mandatory=$true)][string]$file
    )
    Add-Type -Path "C:psitextsharp.dll"
    $pdf = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $file
    for ($page = 1; $page -le $pdf.NumberOfPages; $page  ){
        $text=[iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($pdf,$page)
        Write-Output $text
    }
    $pdf.Close()
}


$content = Read-Host "What are we looking for?: "
$file1 = Read-Host "Path to search: "

$all = Get-Childitem -Path $file1 -Recurse -Filter *.pdf
foreach ($f in $all){
    $outfile = $f -join ', '
    $text = convert-PDFtoText $outfile
}





$text | Out-File "C:psbulk.txt"
Select-String -Path C:psbulk.txt -Pattern $content | Out-File "C:psselect.txt"


Start-Sleep -Seconds 60
 

}

Любая помощь будет очень признательна!

Комментарии:

1. Вы уже пробовали -Append переключиться? $text | Out-File "C:psbulk.txt" -Append

Ответ №1:

Чтобы записать все выходные convert-PDFtoText данные в один выходной файл, используйте один конвейер с командлетом ForEach-Object :

 Get-ChildItem -Path $file1 -Recurse -Filter *.pdf |
  ForEach-Object { convert-PDFtoText $_.FullName } |
    Out-File "C:psbulk.txt"
 

Настройка вашей convert-PDFtoText функции позволит получить более лаконичное и эффективное решение:

Сделайте convert-PDFtoText прием Get-ChildItem входных данных непосредственно из конвейера:

 function convert-PDFtoText {
    param(
        [Alias('FullName')        
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)] 
        [string] $file
    )

    begin {
      Add-Type -Path "C:psitextsharp.dll"
    }

    process {
      $pdf = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $file
      for ($page = 1; $page -le $pdf.NumberOfPages; $page  ) {
        [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($pdf,$page)
      }
      $pdf.Close()
    }

}
 

Это затем позволяет упростить команду вверху, чтобы:

 Get-ChildItem -Path $file1 -Recurse -Filter *.pdf |
  convert-PDFtoText |
    Out-File "C:psbulk.txt"