В очередь!

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

Возьмем, к примеру, банальные пакетные файлы «*.BAT», совершенно не изменившиеся со времен MS-DOS. Вот уже несколько лет операционные системы «Windows» прекрасно обходятся без них, но по-прежнему поддерживают, несмотря на появление командной строки нового поколения (PowerShell). А собственно, почему бы и нет? Когда нет времени разбираться с методами и свойствами объектов файловой системы, форматированием вывода и прочими непонятными словами, старый добрый CMD.EXE может сослужить хорошую службу, как он сделал это сегодня для меня.

Задача, в сущности, была пустяковой — нужно было отправлять в печать множество файлов на новый принтер Хerox iGEN3: на вид - смесь встроенной кухни и конвейера по сборке автомобилей длиной в добрый десяток метров. Задать работу этому монстру совершенно не сложно, пока количество заданий не переваливает за сотню и тогда появляется выбор — бегать с флешкой от компьютера к контроллеру печати (неудобно), печатать через драйвер (медленно), забрасывать файлы по сети в расшаренную папку на контроллере (удобно, но видит он их не сразу). Самым быстрым вариантом оказалось использование стандартной утилиты командной строки LPR.EXE, у которой был только один недостаток — отправка на печать всего одного задания за раз. Елозить мышкой по столу, перетягивая на ярлычок по одному файлу — долго и не комфортно, поэтому пришлось создать текстовый файл «Spool.bat» и вспомнить старые добрые времена.
Команда печати по сети выглядит со всеми нужными параметрами так:

C:\windows\system32\lpr.exe -S 100.100.100.100 -P Foto “d:\arhiv\fotki.pdf”

«C:\windows\system32\lpr.exe» – собственно команда отправки файла в очередь печати на принтере.
«-S 100.100.100.100» — указывает IP-адрес принтера в сети.
«-P Foto» — имя очереди печати. Обычно это просто именованный набор настроек цвета, типа и размера бумаги и других параметров для данного задания.
«“d:\arhiv\fotki.pdf”» - собственно файл, который вы хотите напечатать.
Как я уже упоминал, отправить на принтер сразу несколько файлов вам таким образом не удастся.
Именно здесь нам придет на помощь пакетный файл, который мы сейчас вместе напишем.
Создайте простой текстовый файл (назовите его, например, «Spool») и поменяйте расширение на «bat». Теперь откройте его в Блокноте и введите такие строки:

@ECHO Spool starting
@ECHO Queue: Foto
@ECHO ----------------------------------------------------
:BEGIN
@IF '%1'=='' GOTO END
@TITLE Spooling %1
@ECHO Spooling %1
@%windir%\system32\lpr.exe -S 100.100.100.100 -P Foto %1
@SHIFT
@GOTO BEGIN
:END
@ECHO ----------------------------------------------------
@ECHO Spool finishing
@TITLE All files spooled to queue "Foto"
@PAUSE

Давайте разберем построчно, что же делают эти команды.
Первые три строки выводят сообщение о том, что отправка на печать начата и указывают, в какую именно очередь на печать мы забрасываем файлы. Знак «@» в начале строки указывает, что пользователь должен видеть только результат работы команды, а не саму команду (она будет выведена перед результатом, если этот знак не поставить).

BAT файлы — это простые программы, а значит, в них могут быть конструкции, обычные для других языков программирования. Строка «:BEGIN» означает метку, на которую интерпретатор может перейти по команде GOTO. Использование GOTO в программировании часто считается атавизмом, но сейчас этот рудимент нам как раз пригодится.
Строка «@IF '%1'=='' GOTO END» проверяет, есть ли у запущенного BAT-файла аргументы командной строки (имена файлов для печати) и, если их нет, переходит к завершению, которое в нашем файле отмечено строкой «:END». %1 здесь означает первое из имен файлов, перечисленных в командной строке непосредственно за самой командой. Их вовсе не обязательно набирать на клавиатуре. Это может быть также первый файл из тех, которые вы перетаскиваете мышкой на подготовленный ярлычок «Spool.bat».

Строки «@TITLE Spooling %1» и «@ECHO Spooling %1» меняют заголовок у окна, в котором исполняются команды, и выводят на экран ту же строку, что теперь стоит в заголовке окна, в данном случае — имя обрабатываемого файла. Такой файл у нас есть, иначе одной командой раньше мы перешли бы к завершению работы (вспомните строчку «@IF '%1' ...»).

Строка «@%windir%\system32\lpr.exe -S 100.100.100.100 -P Foto %1» практически идентична той, которую мы разобрали в начале статьи. Первое отличие — в пути к команде используется переменная %windir%, ведь windows не обязательно установлена в каталог по умолчанию. Отличие номер 2 — вместо имени файла используется первый параметр командной строки.

Толку было бы немного, если бы мы на этом остановились, потому что печать одиночного файла мы имели и раньше. Следующая команда «@SHIFT» сдвигает аргументы командной строки: первый из них теряется, на его место становится тот, который раньше стоял вторым, третий становится на место второго и так далее. Если наша команда выглядела так:

Spool.bat “alpha.pdf” “beta.pdf” “gamma.pdf”

то после исполнения «SHIFT» командная строка будет воспринимать ее так:

Spool.bat “beta.pdf” “gamma.pdf”

После этого происходит переход на метку «:BEGIN», после которой все происходит сначала — проверка на наличие аргументов, печать следующего файла и сдвиг аргументов. Если был спечатан последний файл, то интерпретатор считает, что файлов на печать нет, и в строке «@IF '%1' ...» происходит переход на завершение работы. Последняя команда «@PAUSE» не дает окну закрыться, дабы вы могли удостовериться, что все задачи выполнены. Как правило, в этом нет необходимости, поэтому после проверки работоспособности программы вы можете смело стереть или
закомментировать это строку. После этого окно с отчетом об отправке файлов на печать будет само закрываться по завершении работы.
Последний штрих: в очередь отправляется задача с длинным именем наподобие «C:\Documents and Settings\HomeUser\Рабочий
стол\Print\MyDoc1.pdf». К счастью, в BAT-файлах можно использовать некоторые модификаторы для обработки строк. Давайте добавим к команде печати ключ, меняющий имя задачи в очереди печати на более понятное и короткое (имя файла с расширением).

@%windir%\system32\lpr.exe -S 100.100.100.100 -P Foto -J "%~n1%~x1" %1

Единственное неудобство при использовании созданной команды Spool.bat – отсутствие индикации: непонятно, какая часть текущего файла отправлена на печать и как долго еще нужно ждать. Это можно исправить, переписав скрипт для исполнения в другой среде с большими возможностями (например, в PowerShell). Лично для меня этот недостаток перекрывается одним большим достоинством — это работает, и работает надежно. А большего и не нужно.

Александр Поляков. Lecosson@mail.ru


Компьютерная газета. Статья была опубликована в номере 33 за 2009 год в рубрике soft

©1997-2022 Компьютерная газета