Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Печать pdf-файлов из командной строки. (http://forum.oszone.net/showthread.php?t=339009)

Michael 01-02-2019 11:46 2855727

Печать pdf-файлов из командной строки.
 
Начало здесь
В определенный каталог пользователь выкладывает pdf-файлы.
Надо в автоматическом режиме их печатать из командной строки (скриптом в шедулере)
Можно сделать так:
Код:

"c:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /n /t c:\temp\print\small.pdf
Но после печати процесс Adobe Acrobat Reader не завершается, соответственно батник "замирает".
Решил переносить файлы в подкаталог и оттуда их печатать, а удалять другим скриптом (где-нибудь в автозагрузке).
Проблема в том, что файлы могут быть до 50Мб и, чисто теоретически, процесс переноса может быть запущен в том момент, когда копирование в подкаталог еще не завершилось. Поэтому файл переименовываю в каталоге, проверяю на ошибку переименования (файл "занят"), потом переношу и из подкаталога печатаю.
Получилось следующим образом:
Код:

echo off
Setlocal EnableDelayedExpansion
rem имя файла для печати
set FileNameForPrint=0
rem каталог, в который пользователь помещает файлы
set DirNameForPrint=d:\printer\
rem каталог, куда перемещается файл, который надо распечатать и удалить, является подкаталогом для DirNameForPrint
set DirNameForDel=d:\printer\del\
cd /d %DirNameForPrint%
FOR %%i IN (*.pdf) DO (
        set FileNameForPrint="%%~ni__!random!".pdf
        rename "!DirNameForPrint!%%i" "!FileNameForPrint!"
        if %ERRORLEVEL% EQU 0 (
        move /y "!DirNameForPrint!!FileNameForPrint!" "!DirNameForDel!"
        !ProgramFiles!\print_job\nircmd.exe shexec "print" "!DirNameForDel!!FileNameForPrint!"
                )

        )

Скрипт в шедулере с повторением каждые 2 минуты.
Так же в шедулере скрипт очистки подкаталога с запуском при включении компьютера
Код:

del /f /q d:\printer\del\*.*
Имеет право на жизнь? Пока вроде работает.
P.S. странно, но справка по if (if /?) выдает, что для сравнения нужна команда EQL, хотя по факту - EQU

Iska 01-02-2019 12:35 2855735

Цитата:

Цитата Michael
Имеет право на жизнь? »

Неа. Рано или поздно столкнётесь с ошибками. Смотрите ссылку на тему на Сером форуме, которую я приводил в прошлой теме — скрипт следит за каталогом в синхронном режиме.

Цитата:

Цитата Michael
P.S. странно, но справка по if (if /?) выдает, что для сравнения нужна команда EQL, хотя по факту - EQU »

Это очень, очень старая история. Все через это проходят.

Michael 01-02-2019 13:07 2855740

Iska, не, пожалуй буду решать проблемы по мере их поступления. Но за ссылку спасибо

megaloman 01-02-2019 17:46 2855774

Michael,
Вот вариант, вроде бы хватает одного батника
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
        Set "Mask=*.pdf"

        Set /A Repeat=60
        Set /A Waiting=30

        Set "PRG="c:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /n /t"
rem        Set "PRG="C:\Program Files\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" /n /t"

        :Begin
                If Not Exist "%BoxIn%\Tmp" Md "%BoxIn%\Tmp"       
                      FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /b /a:-D "%BoxIn%\%Mask%"`) DO (
                        Move /Y "%BoxIn%\%%f" "%BoxIn%\Tmp\%%f" >NUL &&Call :Out "%BoxIn%\Tmp\%%f" %Waiting%
                )
                Timeout /T %Repeat%
rem                CHOICE /C YN /T %Repeat% /D Y /M "Y-Продолжить работу,  N-Завершить командный файл"
rem                If %ErrorLevel%==2 Exit /B 2
        GoTo :Begin
Exit /B

:Out
        Start " " %PRG% %1
        :OutWait
                Timeout /T %2
                Del %1 >nul 2>&1
                If Exist %1 GoTo :OutWait
Exit /B

Цитата:

Цитата Michael
В определенный каталог пользователь выкладывает pdf-файлы. »

В этом каталоге организуем каталог TMP. Туда переносим последовательно файл пользователя. При благополучном переносе запускаем акробата. Даём время для его загрузки (у меня Set /A Waiting=30) сек. Пытаемся удалить файл. Если акробат не отработал, файл будет занят и не удалится. С задержками будем пытаться удалить файл, пока не добьемся успеха. Переходим к обработке следующего файла. Если список файлов исчерпан, повторим батник через некоторое время (у меня Set /A Repeat=60) сек.

megaloman 02-02-2019 12:11 2855888

Michael, простите великодушно за неуместное любопытство: а зачем вообще эта возня, если файлы печатаете в автоматическом режиме? Почему сразу не поставить пользователям сетевой принтер и акробат? Имхо, акробат, или нечто подобное, должен присутствовать у каждого. По крайней мере, у тех пользователей, которым приходится в конечном итоге отправлять pdf на печать.

Busla 02-02-2019 14:57 2855897

megaloman, пользователь может на удалёке/ в филиале за 1000 км формировать документы. А местный персонал на них только печать ставит.

Michael 06-02-2019 10:18 2856484


Цитата:

Цитата megaloman
а зачем вообще эта возня, если файлы печатаете в автоматическом режиме? »

Есть острая необходимость раз в месяц распечатать порядка 8000 страниц, причем чем быстрее - тем лучше,
Есть старенькая тошиба, которую не удалось подцепить на сервер печати под управлением windows server 2008R2, но, во-первых, выкидывать ее жалко, во-вторых - файлы на печать изначально формируются в pdf-формате. Решил заморочиться


Время: 02:19.

Время: 02:19.
© OSzone.net 2001-