【问题标题】:How to print PDF files in a sequence using Powershell?如何使用 Powershell 按顺序打印 PDF 文件?
【发布时间】:2020-02-06 21:38:11
【问题描述】:

我有一堆 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。

不同的试验打印出不同的文件序列,因此,我担心错误与打印队列或 start-process 命令有关。我的猜测是每个打印过程都会被触发,而无需等待前一个打印过程完成。

有没有办法以我指定的顺序一致地打印出 PDF 文件?

【问题讨论】:

    标签: powershell pdf


    【解决方案1】:

    您正在按顺序启动进程,但默认情况下Start-Process 不会等到命令完成后再启动下一个进程。由于命令根据 .PDF 文件大小完成不同的时间,因此它们以完成的顺序打印。尝试将-wait 开关添加到您的Start-Process,这将强制它等待命令完成之前开始下一个。

    编辑:在 Stack 的其他地方找到了一篇文章来解决这个问题。也许会有所帮助。 https://superuser.com/questions/1277881/batch-printing-pdfs

    此外,还有许多不是 Adob​​e 的 PDF 解决方案,其中一些在自动化方面比标准阅读器要好得多。 Adobe 已获得许可的 .DLL 文件,您可以使用,并且 Acrobat 的专业版也可以连接到后端 .DLL。

    如果您必须使用 Acrobat Reader DC(封闭系统或类似系统),那么我会尝试打开要打印的文件并获取指向进程的指针,然后等待一段时间,然后强制关闭进程。如果您的 PDF 大小已知,并且您可以估计完成打印需要多长时间,这样您就不会在完成之前终止该过程。像这样的:

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

    编辑#2:一种可能的(但未经测试的)优化是您可以使用处理器时间计数器$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 循环内休眠的秒数。

    【讨论】:

    • 打印第一个文件后,等待开关停止打印过程。 get-childItem "*.pdf" | sort lastWriteTime | foreach-object {start-process $._Name -verb 'print' -wait}我的理论是,由 start-process 命令调用的 Adob​​e Reader 在打印第一个文档后永远不会关闭
    • 我已将程序设置为在触发下一次打印之前等待 6 秒。尽管有时文件会乱序打印,但它似乎是时间和准确性之间的最佳平衡点。
    • 如果您想尝试进一步优化时间,您可能能够使用$proc.PrivilegedProcessorTime$proc.UserProcessorTime 检测进程何时空闲,这应该会停止递增当过程完成打印时。假设较大的 PDF 文件需要更长的打印时间,您还可以根据 .PDF 文件的大小(在 ForEach 中使用 $PDF.Length)调整时间。当然,尺寸并不总是与打印时间直接相关,所以 YMMV。很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多