У меня есть код, цель которого — найти все PDF-файлы в папке, которые были изменены в течение x дней (в соответствии с данными, введенными пользователем).
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$title = 'PDF Last Modified'
$msg = 'Days prior:'
$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
$headers = @{Expression={$_.CreationTime};Label="File Created";width=25}, `
@{Expression={$_.LastWriteTime};Label="File Edited";width=25}, `
@{Expression={"{0}" -f $_.FullName.Split("\")[-2]};Label="Folder";width=30}, `
@{Expression={$_.Name};Label="File Name";width=50}
Get-ChildItem -Path ..\ -Recurse -Filter *.pdf | Where-Object {$_.lastwritetime -gt (Get-Date).AddDays(-$text)} | sort LastWriteTime -descending | format-table $headers | out-file PDFOutput-$(get-date -f yyyy-MM-dd).txt -width 300
Я хотел бы внести два улучшения.
Каждый из этих файлов PDF на самом деле является формой, и внизу этой формы находится строка чисел, которая определяет, куда должна быть отправлена эта форма. Я знаю, что мне нужно использовать itextsharp.dll для разбора файла PDF; я хотел бы включить в выходной файл после "Имени файла" заголовок "Назначение" и включить эту строку из формы PDF.
В начальном окне VB-Input спрашивается, за сколько дней до этого скрипт должен искать. Я бы хотел добавить второй ввод, который запрашивает любые параметры поиска для заголовка, так что если пользователь вводит, скажем, «чек», скрипт находит любой файл с названиемквитанция.pdf (подстановочные знаки по обе стороны от него, чтобы найти laptop-receipt-2015-11-17.pdf).
Любая помощь будет высоко оценена!
решение1
Я не вижу особых усилий в реализации Ваших планов.
- Поскольку Get-ChildItem не предоставляет свойство,
Destination
вам придется добавить его самостоятельно с помощью вычисляемого свойства. - сохранить результаты gci в переменной и повторить ее для запускатвойкод для получения назначения для каждого файла.
- Измените хеш-таблицу $headers в соответствии с вашими потребностями (Метка/Выражение могут быть сокращены)
Нет времени разрабатывать для вас важный код itextsharp.dll.
## Q:\Test\2019\03\23\SU_1416552.ps1
$Folder = (Get-Item ..).FullName
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$title = 'PDF Last Modified'
$msg = 'Days prior:'
$DaysPrior = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
$title = 'PDF Name Part'
$msg = 'String:'
$Namepart = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
$PdfFiles = Get-ChildItem (Join-Path $Folder ("*{0}*" -f $NamePart)) -Recurse -File -Filter *.pdf|
Where-Object LastWriteTime -gt (Get-Date).AddDays(-$DaysPrior) |
Sort-Object LastWriteTime -descending |
Select-Object -Property FullName,Name,CreationTime,LastWriteTime,
@{L='Destination';E={$Null}}
foreach ($PdfFile in $PdfFiles){
##
## Insert **your** code to get FormField Destination
##
$PdfFile.Destination = "string of numbers"
}
$headers = @{L="File Created";width=25;E={$_.CreationTime}},
@{L="File Edited" ;width=25;E={$_.LastWriteTime}},
@{L="Folder" ;width=30;E={$_.FullName.Split("\")[-2]}},
@{L="File Name" ;width=50;E={$_.Name}},
@{L="Destination" ;width=30;E={$_.Destination}}
$PdfFiles | Format-Table $headers |
Out-File PDFOutput-$(get-date -f yyyy-MM-dd).txt -width 300