我有一堆 PDF 文件,我想使用 Powershell 在 Windows 7 计算机上按顺序打印它们。
get-childItem "*.pdf" | sort lastWriteTime | foreach-object {start-process $._Name -verb 'print'}
打印的文件有时会出现乱序,例如 1) A.pdf、2) C.pdf、3) B.pdf 4) D.pdf。
不同的试验打印出不同的文件序列,因此,我担心错误与打印队列或 start-process 命令有关。我的猜测是每个打印过程都会被触发,而无需等待前一个打印过程完成。
有没有办法按照我指定的顺序一致地打印出 PDF 文件?
最佳答案
您正在按顺序启动进程,但默认为 Start-Process
不会等到命令完成才开始下一个命令。由于根据 .PDF 文件的大小,命令需要不同的时间来完成,因此它们以任何完成的顺序打印。尝试添加 -wait
切换到您的Start-Process
,这将迫使它等到命令完成后再开始下一个命令。
编辑:在 Stack 的其他地方找到了一篇文章来解决这个问题。也许会有所帮助。 https://superuser.com/questions/1277881/batch-printing-pdfs
此外,还有许多不是 Adobe 的 PDF 解决方案,其中一些在自动化方面比标准阅读器要好得多。 Adobe 拥有您可以使用的许可 .DLL 文件,并且 Acrobat 的专业版还具有与后端 .DLL Hook 的功能。
如果您必须使用 Acrobat Reader DC(封闭系统或类似系统),那么我会尝试打开要打印的文件并获取指向进程的指针,然后等待一段时间,然后强制关闭进程。如果您的 PDF 大小已知并且您可以估计完成打印需要多长时间,这样您就不会在完成之前终止该过程,这将很有效。像这样的东西:
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
}
如果程序仍然过早结束,您可能需要增加 # of seconds 以在内部 Do 循环内休眠。
关于powershell - 如何使用 Powershell 按顺序打印 PDF 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60103920/