Как распечатать PDF-файлы в последовательности, используя Powershell? - PullRequest
1 голос
/ 07 февраля 2020

У меня есть несколько файлов PDF, которые я хотел бы распечатать последовательно на компьютере windows 7 с использованием Powershell.

get-childItem "*.pdf" | sort lastWriteTime | foreach-object {start-process $._Name -verb 'print'}

Печатные файлы иногда не в порядке, например 1) A. pdf, 2) C .pdf, 3) B.pdf 4) D.pdf.

Различные испытания распечатывали разные последовательности файлов, поэтому я боюсь, что ошибка связана с очередью печати или команда запуска процесса. Я предполагаю, что каждый процесс печати запускается без ожидания завершения предыдущего процесса печати. ​​

Есть ли способ последовательно распечатывать PDF-файлы в указанной мной последовательности?

1 Ответ

2 голосов
/ 07 февраля 2020

Вы запускаете процессы по порядку, но по умолчанию Start-Process не ждет, пока команда завершит выполнение, прежде чем она запустит следующую. Поскольку выполнение команд занимает разное время в зависимости от размера файла .PDF, они печатаются в любом порядке, в котором они заканчиваются sh. Попробуйте добавить переключатель -wait к вашему Start-Process, что заставит его ждать до тех пор, пока Команда завершается перед запуском следующей.

РЕДАКТИРОВАТЬ: В другом месте в стеке найдена статья, в которой об этом говорится. Может быть, это поможет. https://superuser.com/questions/1277881/batch-printing-pdfs

Кроме того, существует ряд решений PDF, которые не являются Adobe, и некоторые из них намного лучше для автоматизации, чем стандартный Reader. Adobe имеет лицензию на файлы .DLL, которые вы можете использовать, а профессиональная версия Acrobat также имеет хуки для внутреннего интерфейса .DLL.

Если вам необходимо использовать Acrobat Reader D C (закрытая система или что-то подобное) затем я попытался бы открыть файл для печати и получить указатель на процесс, затем подождать некоторое время и принудительно закрыть процесс. Это будет хорошо работать, если ваши размеры PDF известны, и вы можете оценить, сколько времени потребуется, чтобы завершить печать sh, чтобы не прерывать процесс до его завершения. Примерно так:

ForEach ($PDF in (gci "*.pdf"))
{
    $proc = Start-Process $PDF.FullName -PassThru
    Start-Sleep -Seconds $NumberOfSeconds
    $proc | Stop-Process
}

РЕДАКТИРОВАТЬ # 2: Одна из возможных (но не проверенных) оптимизаций заключается в том, что вы можете использовать счетчики ProcessorTime $proc.PrivilegedProcessorTime и $proc.UserProcessorTime, чтобы увидеть, когда процесс будет простаивать. Конечно, это предполагает, что программа после печати полностью простаивает. Я бы попробовал что-то вроде этого:

$LastPrivTime = 0
$LastUserTime = 0
ForEach ($PDF in (gci "*.pdf"))
{
    $proc = Start-Process $PDF.FullName -PassThru
    Do
    {
        Start-Sleep -Seconds 1
        $PrivTimeElapsed = $proc.PrivilegedProcessorTime - $LastPrivTime
        $UserTimeElapsed = $proc.UserProcessorTime - $LastUserTime
        $LastPrivTime = $proc.PrivilegedProcessorTime
        $LastUserTime = $proc.UserProcessorTime
    } 
    Until ($PrivTimeElapsed -eq 0 -and $UserTimeElapsed -eq 0)
    $proc | Stop-Process
}

Если программа все еще заканчивается слишком рано, вам может потребоваться увеличить количество # секунд, чтобы заснуть во внутренней Do l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...