Сценарий Powershell для печати, перемещения, а затем закрыть Adobe после завершения - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь создать скрипт, который будет печатать любые PDF-файлы, которые находятся в указанной папке при запуске. Кроме того, я хотел бы, чтобы скрипт переместил эти PDF-файлы в папку «Архив» для справки после того, как файл был напечатан. Кроме того, скрипт должен будет закрыть Adobe после его завершения.

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

$files = Get-ChildItem “C:\Users\bwhite\Desktop\DocsToPrint\*.pdf”

foreach ($file in $files){
    start-process -FilePath $file.fullName -Verb Print -PassThru -Wait
}

Move-Item -Path C:\Users\bwhite\Desktop\DocsToPrint\*.pdf -Destination C:\Users\bwhite\Desktop\DocsToPrint\Archive

1 Ответ

0 голосов
/ 06 июня 2019

Отправка файла на принтер является спулинг-процессом для диспетчера печати.Скорость принтера, определит, выполнено ли задание на печать.Отправка на принтер выполняется быстро, и файловая система завершает работу с файлом и переходит к следующему.

Задания будут просто стоять в очереди в спулере.Вы не выполняете никаких действий с принтером, включая ошибки печати.Вам нужно написать код для отслеживания успеха и сбоя работы принтера, прежде чем обрабатывать другой файл.

Что-то похожее на приведенное ниже.(хотя я не добавил никакой обработки ошибок - я оставлю это вам) (хорошо, что и я использую .txt файлы против Adobe)

С или без -Wait, это работает в моей системекак и ожидалось.Конечно, уберите все содержимое выходного сообщения, если вы не хотите его видеть.Кроме того, Adobe останется открытой, поэтому вам нужно написать код, чтобы убить его.

# Get default printer if that is the printer target
$PrinterName = Get-CimInstance -ClassName Win32_Printer | 
ForEach { $PSItem | Where Default -eq $true }

Get-ChildItem 'D:\Temp\NewFiles\*.txt' | Select -First 3 | 
foreach {
    start-process -FilePath $PSItem.FullName -Verb Print -PassThru #-Wait

    do
    {
        # Get all print jobs on the target printer
        $PrintJobs = Get-CimInstance -Class Win32_PerfFormattedData_Spooler_PrintQueue | 
        Where-Object -Property Name -eq $PrinterName.Name | 
        Select Name, JobsSpooling, Jobs, JobErrors
        Write-Warning -Message "Please wait. Printing $($PSItem.Name) now."
    }
    while ($PrintJobs.Jobs -ne 0)

    # Archive the file when the print job is complete
    $paramblock = @{
        Path = $PSItem.FullName
        Destination = 'D:\temp\Archive'
    }

    Write-Warning -Message "Printing for $($PSItem.Name) complete. Archiving the file."
    Move-Item @paramblock -Verbose
}

# Results, with the -wait, lots of message with each file printed.
<#
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                                                                     
-------  ------    -----      -----     ------     --  -- -----------                                                                     
     30       5     1072       2044       0.02  19364   1 notepad                                                                         
WARNING: Please wait. Printing TestFile0.txt now.
WARNING: Please wait. Printing TestFile0.txt now.
WARNING: Please wait. Printing TestFile0.txt now.
...
WARNING: Printing for TestFile0.txt complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile0.txt Destination: D:\temp\Archive\TestFile0.txt".
     29       5      996       1880       0.00   6708   1 notepad                                                                         
WARNING: Please wait. Printing TestFile1.txt now.
WARNING: Please wait. Printing TestFile1.txt now.
WARNING: Please wait. Printing TestFile1.txt now.
...
WARNING: Please wait. Printing TestFile1.txt now.
WARNING: Printing for TestFile1.txt complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile1.txt Destination: D:\temp\Archive\TestFile1.txt".
     27       4      908       1760       0.03  10108   1 notepad                                                                         
WARNING: Please wait. Printing TestFile2.txt now.
WARNING: Please wait. Printing TestFile2.txt now.
WARNING: Please wait. Printing TestFile2.txt now.
...
WARNING: Printing for TestFile2.txt complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile2.txt Destination: D:\temp\Archive\TestFile2.txt".
#>



# Without the -Wait, lot's of message output for the first file printed, only 3 messages for each file there after.

<#
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                                                                     
-------  ------    -----      -----     ------     --  -- -----------                                                                     
     30       5     1032       1908       0.02   3704   1 notepad                                                                         
WARNING: Please wait. Printing TestFile0.txt now.
WARNING: Please wait. Printing TestFile0.txt now.
WARNING: Please wait. Printing TestFile0.txt now.
...
WARNING: Printing for TestFile0.txt complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile0.txt Destination: D:\temp\Archive\TestFile0.txt".
     28       4      936       1788       0.00  13772   1 notepad                                                                         
WARNING: Please wait. Printing TestFile1.txt now.
WARNING: Printing for TestFile1.txt complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile1.txt Destination: D:\temp\Archive\TestFile1.txt".
     28       4      852       1700       0.00   6196   1 notepad                                                                         
WARNING: Please wait. Printing TestFile2.txt now.
WARNING: Printing for TestFile2.txt complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile2.txt Destination: D:\temp\Archive\TestFile2.txt".
#>

Обновление для ОП с этого.

Я попытался внести небольшие изменения, чтобы приспособить пути к моим файлам и использовать их с PDF-файлами, однако он сразу печатает первый, и я получил 45942 строки предупреждения о записи для первого файла, прежде чем я остановил сценарий

Эти сообщения есть только ради того, что происходит и когда.Они не нужны вообще.

Теперь, несмотря на все сказанное, это звучит экологично.

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

Таким образом, Adobe является основной причиной проблемы, а не PowerShell, когда речь идет о проблемах, с которыми вы сталкиваетесь.PDF-файлы, которые я создал и поместил в эту папку для проверки, были точно такими же, как и в текстовых файлах.

Фактические результаты, без использования -wait:

<#
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                                                                     
-------  ------    -----      -----     ------     --  -- -----------                                                                     
     40       4      744       2216       0.05  18060   2 AcroRd32                                                                        
WARNING: Please wait. Printing TestFile0.pdf now.
WARNING: Printing for TestFile0.pdf complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile0.pdf Destination: D:\temp\Archive\TestFile0.pdf".
     49       5      796       2488       0.02   7588   2 AcroRd32                                                                        
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Please wait. Printing TestFile1.pdf now.
WARNING: Printing for TestFile1.pdf complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile1.pdf Destination: D:\temp\Archive\TestFile1.pdf".
     47       5      824       2532       0.00  23528   2 AcroRd32                                                                        
WARNING: Please wait. Printing TestFile2.pdf now.
WARNING: Printing for TestFile2.pdf complete. Archiving the file.
VERBOSE: Performing the operation "Move File" on target "Item: D:\Temp\NewFiles\TestFile2.pdf Destination: D:\temp\Archive\TestFile2.pdf".
#>

Каждый файл маленький (1 страница - 6 строк текста или около того каждый), имея почти точно такой же контент.Наблюдая за очередью печати во время ее выполнения, вы увидите, сколько времени занимает каждое задание на печать, это не относится к тому, что Adobe ускорила выпуск файла для перемещения.

Чем больше размер PDF,чем дольше это займет на работу.Опять же, используйте сообщение только для небольшого образца, а не для производственного цикла.Помните, что вы буквально запускаете Adobe каждый раз, как показано с помощью уникального сгенерированного ProcessId.

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