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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Автоустановка принтера этикеток. Логика определения USB порта (http://forum.oszone.net/showthread.php?t=345925)

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
                                )
                        )
                )


cheloveshka 28-08-2020 22:45 2932331

Какой вопрос задал - такой ответ и получил.
Прошу помочь попунктно:
1) Имеем цикл
Код:

for /f "skip=1 tokens=*" %%p in ('wmic PRINTER where "PortName like 'USB%'" Get DeviceID') DO echo.%%p>>%CurrentPath%\PrintList.txt
Получаем файл PrintList.txt с содержимым:
Скрытый текст

Printer VendorName1
Printer VendorName2
Printer VendorName3
\\192.168.1.10\SharedPrinter1

Далее хочу задать значение каждой строки целиком в качестве переменной и обработать следующим образом:

Если в текстовом файле имеется только одна строка, содержащая "Printer VendorName1", то выполнить команду 1

Если в текстовом файле имеется только одна строка, содержащая Printer VendorName2, то выполнить ряд команд 2 3 4

Как это вижу я:
Код:

for /f "delims=" %%b in ('%CurrentPath%\PrintList.txt') DO Set PrintNames=%%b
if /i "%PrintNames%"=="Printer VendorName1" (@if /i "%b" EQU 1 (
        rundll32 printui.dll,PrintUIEntry /ia /f "driver.inf" /m "DriverModelName"
        rundll32 printui.dll,PrintUIEntry /Xs /n "Printer VendorName1" DriverName "DriverModelName"
        rem Переименовываю принтер
        rundll32 printui.dll,PrintUIEntry /Xs /n "%PrintNames%" PrinterName "CurentPrinter"
        @echo Успех
        )       
if /i "%b"=="Printer VendorName2" (@if /i "%b" EQU 1 (               
        rundll32 printui.dll,PrintUIEntry /Xs /n "Printer VendorName2" DriverName "DriverModelName"
        @echo Успех
        ) Else (....



Время: 10:52.

Время: 10:52.
© OSzone.net 2001-