cheloveshka |
22-07-2020 22:40 2928991 |
Автоустановка принтера этикеток. Логика определения USB порта
Добрый день! Долго пытался напрягать все извилины, чтобы научиться писать скриптики. Что-то получилось, а что-то нет.
Прошу помочь добить логику скрипта, который помогает юзеру установить драйвер принтера на правильный юсб порт.
Все действия старался описать в комментариях. Знаю, что в первом же IF у меня написана чушь. Не знаю как это реализовать. Прошу, по возможности, помочь.
Спасибо
Код:
echo off &chcp 866 >nul
set "CurrentPath=%~dp0"
@echo Установка драйвера принтера с именем Zebra
rem Получаю список имён принтеров в системе, использующие USB порты
for /f "skip=1 tokens=*" %%p in ('wmic PRINTER where "PortName like 'USB%'" Get DeviceID') DO echo.%%p>>%CurrentPath%\PrintList.txt
findstr /vrc:"^$" %CurrentPath%\PrintList.txt
for /f "delims=" %%b in ('%CurrentPath%\PrintList.txt') DO Set PrintNames=%%p
rem Если один из двух типов принтеров уже установлен в системе, переименовать его в Zebra
rem Если в PrintList.txt есть лишь одна строка, содержащая TSC TDP-225, то
if /i "TSC TDP-225" EQU 1 (
rem Переименовываю принтер
rundll32 printui.dll,PrintUIEntry /Xs /n "%PrintNames%" PrinterName "Zebra"
rem Добавляю драйвер ZDesigner в систему
rundll32 printui.dll,PrintUIEntry /ia /f "ZBRN.inf" /m "ZDesigner LP 2824 Plus (ZPL)"
rem Заменяю текущий драйвер на ZDesigner
rundll32 printui.dll,PrintUIEntry /Xs /n "TSC TDP-225" DriverName "ZDesigner LP 2824 Plus (ZPL)"
rem Если в PrintList.txt есть лишь одна строка, содержащая ZDesigner, то
if /i "ZDesigner" EQU 1 (
rem Переименовываю принтер
rundll32 printui.dll,PrintUIEntry /Xs /n "%PrintNames%" PrinterName "Zebra"
)
) Else (
rem Устанавливаю драйвер принтера с именем Zebra на порт USB001
rundll32 printui.dll,PrintUIEntry /if /b "Zebra" /f "%CurrentPath%\ZBRN\ZBRN.inf" /m "ZDesigner LP 2824 Plus (ZPL)" /r "USB001"
rem Посылаю задание пробной печати в очередь печати
rundll32 printui.dll,PrintUIEntry /k /n "Zebra"
rem Логика определения правильного порта предполагает выбор верного решения оператором методом перебора, т.к. в системе может быть несколько USB поров
rem причем не обязательно, чтобы они шли по-порядку, вроде USB001, USB002 и т.д.
rem Определяю, требуется ли вмешательство оператора: для каждого значения строки, содержащей USB, в списке портов принтеров, где портом является USB, задать переменную USBPorts
for /f %%u in ('wmic PRINTER where "PortName like 'USB%'" Get PortName | FindStr /I /M USB' DO Set USBPorts=%%u
rem Если строк больше чем 1, то выполнить цикл с поочередной подстановкой каждого из значений переменной в команду (если в команду подставить текущий назначенный порт, то ошибки не будет)
if /i "%USBPorts%" GTR 1 (
rem Вывожу сообщение с инструкцией для пользователя
mshta.exe vbscript:Execute^("msgbox ""Принтер распечатал тестовую этикетку?""& VbCrLf & VbCrLf &""Если ДА, нажмите кнопку Y в черном окне""& VbCrLf & VbCrLf &""Если НЕТ, нажмите кнопку N в черном окне"",vbexclamation,""ВНИМАНИЕ! Требуется выбор действия"":close"^)
pause>nul
rem Блок выбора с двумя вариантами сценария
Choice
if %errorlevel%==-1 goto :error
call :%errorlevel%
goto :EndChoice
rem Если распечаталась, выхожу из цикла
:1
@echo Принтер установлен
goto :EndChoice
exit /b
rem Если не распечаталось, то подставляю следующее значение из переменной и меняю порт принтера
:2
@echo
timeout /T 10
rundll32 printui.dll,PrintUIEntry /Xs /n "Zebra" PortName "%USBPorts%"
exit /b
:error
mshta.exe vbscript:Execute^("msgbox ""Принтер был установлен в систему, но при попытке настройки произошла неизвестная ошибка""& VbCrLf & VbCrLf &""Свяжитесь с технической поддержкой"",vbexclamation,""Ошибка установки драйвера принтера"":close"^)
:EndChoice
)
)
)
|