#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"