Вы запускаете процессы по порядку, но по умолчанию 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.