首页 > 解决方案 > PDF打印脚本

问题描述

我需要打印很多文件,我不想去每个选择它并打印所有文件。这些文档有修订版并且都在同一个文件夹中。我想打印这些文件的最新版本。这些文件的格式是

630-0-110
9A-0-9 
44-0-190
44-0-191

在这四个 pdf 文件中,44-0-191是比44-0-190所以我想打印630-0-110的更新版本9A-0-9,,,44-0-191

我需要打印从6-0-(revision no.) 到699A-0-(revision no.) 的数字,其中一些数字在开头也有 A、B、C。

有没有办法创建一个外壳来自动打印这些?还是我必须手动 ctrl+click 来打印它们?

如果我可以创建一个外壳,我该怎么做?

标签: windowscmdpowershell-2.0

解决方案


您的任务需要几个步骤

  • 列出文档,使用正则表达式从修订中拆分名称,
  • 按名称对文档进行分组,
  • 每组按修订数字排序,
  • 只获得最高转速。(最后一个)

  • 选择打印机/或使用定义的/默认标准打印机

由于您的修订号有不同的地方,您需要对数字进行排序,这是通过$ToNatural实现的

为了测试排序,我使用了扩展样本(要打印的修订标记为 **)

44-0-19.pdf      
44-0-190.pdf
44-0-191.pdf    **
44-0-2.pdf
630-0-110.pdf   **
630-0-90.pdf
9A-0-10.pdf     **
9A-0-9.pdf

## Q:\Test\2018\07\09\SO_51246286.ps1
#Requires -Version 3

## To sort numbers with a different places count use:
## $ToNatural from Roman Kuzmin source https://stackoverflow.com/a/5429048/6811411
$ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20,"0") }) }

Push-Location "X:\start\folder"

$PDFsToPrint = (Get-ChildItem *.pdf -File |
  Where-Object BaseName -match '^([0-9]+[A-C]?-\d+)-(\d+)$'|
    Group-Object {$Matches[1]} |
      Foreach-Object {
        $_.Group | Sort-Object $ToNatural | Select-Object -Last 1
      } ).FullName
# $PDFsToPrint

Pop-Location

$Printer = Get-Printer | Select-Object Name,Drivername,PortName |
   Out-GridView -Title "Select the printer for output" -OutputMode Single

#Adobe SDK: http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/Acrobat_SDK_developer_faq.pdf
$Acrobat = 'C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe'

ForEach($Pdf in $PDFsToPrint) {
    $ArgList=' /S /T "{0}" "{1}" "{2}" {3}' -f `
        $Pdf,
        $Printer.Name,
        $Printer.DriverName,
        $Printer.PortName

    Start-Process $Acrobat -ArgumentList $ArgList
    #Start-Sleep -Seconds 60  #optional delay    
}

推荐阅读