CMD/BAT - Автоустановка принтера этикеток. Логика определения USB порта

Ответить
Аватара пользователя
cheloveshka

CMD/BAT - Автоустановка принтера этикеток. Логика определения USB порта

Сообщение cheloveshka »

Добрый день! Долго пытался напрягать все извилины, чтобы научиться писать скриптики. Что-то получилось, а что-то нет.

Прошу помочь добить логику скрипта, который помогает юзеру установить драйвер принтера на правильный юсб порт.

Все действия старался описать в комментариях. Знаю, что в первом же 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

Re: CMD/BAT - Автоустановка принтера этикеток. Логика определения USB порта

Сообщение cheloveshka »

Какой вопрос задал - такой ответ и получил.

Прошу помочь попунктно:

1) Имеем цикл



Код:

Код: Выделить всё

for /f "skip=1 tokens=*" %%p in ('wmic PRINTER where "PortName like 'USB%'" Get DeviceID') DO echo.%%p>>%CurrentPath%\PrintList.txt

Получаем файл PrintList.txt с содержимым:


Скрытый текст

[spoiler]Printer VendorName1

Printer VendorName2

Printer VendorName3

\\192.168.1.10\SharedPrinter1[/spoiler]




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



Если в текстовом файле имеется только одна строка, содержащая "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 (....
Ответить

Вернуться в «Скриптовые языки администрирования Windows»