1

В Windows 7/8 [.1] вы можете настроить принтер и информацию о портах через командную строку как администратор, например:

cd /d %WINDIR%\System32\Printing_Admin_Scripts\en-US
prnmngr -s computer-01 -l

перечислю принтеры, подключенные к computer-01 , используя мои учетные данные для входа. Это производит много строк вывода, включая порт принтера. Моя цель - найти порт принтера, предполагая, что это порт TCP/IP, а затем запустить команду prnport чтобы отключить состояние SNMP для этого порта. Ниже приведен пример вывода двух разных принтеров, для которых используется USB, а для другого - принтер TCP/IP:

Server name
Printer name JMC-KMC224-BW
Share name
Driver name KONICA MINOLTA C364SeriesPCL
Port name IP_192.168.0.11
Comment
Location
Print processor KOAYTJ_P
Data type RAW
Parameters
Attributes 2628
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle
Extended printer status Unknown
Detected error state Unknown
Extended detected error state Unknown

Server name
Printer name DYMO LabelWriter 400
Share name
Driver name DYMO LabelWriter 400
Port name USB001
Comment
Location
Print processor winprint
Data type RAW
Parameters
Attributes 2624
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle
Extended printer status Unknown
Detected error state Unknown
Extended detected error state Unknown

(Примечание: это не проблема XY, проблема известна производителю, и отключение SNMP является известным решением.)

Как я могу найти имя порта, которое является портом TCP/IP, и поместить его в переменную, которую я могу запустить с командой prnport ?

1 ответ1

2

Одна из проблем, с которой вы столкнетесь, заключается в том, что имя порта является свободным текстом: оно может быть практически любым; это не гарантированно будет IP-адрес. Если вы не уверены, что люди, настраивающие принтеры, явно задают имена, начинающиеся с IP_ , это не гарантируется.

Я бы порекомендовал использовать PowerShell, если вы можете; очень полезными выглядят командлеты Get-PrinterPort и Set-PrinterProperty или, возможно, командлеты Set-PrintConfiguration (документы Win10, документы Win8, документы Win8.1). К сожалению, они доступны только в Windows 8 или Server 2012 и новее. В настоящий момент у меня есть доступ только к Windows 7, и я не могу их протестировать.


В противном случае вы можете использовать prnport напрямую, вместо того чтобы сначала prnmngr . prnport -l выведет список всех портов TCP". Если вы используете это в сочетании со сценарием, похожим на сценарий Дэвида, вы получите правильные результаты:

NB: Вы , возможно , потребуется заменить prnport вызовы с cscript %windir%\System32\Printing_Admin_Scripts\en-US\prnport.vbs в зависимости от настроек. Также может измениться регион en-US .

for /f "tokens=1,2,*" %%a in ('prnport -s computer-01 -l ^| find "Port name"') do (
    prnport -t -s computer-01 -r "%%c" -md
)

Краткое объяснение:

  • Это расширенный цикл. Смотрите for для деталей.
  • Мы перебираем все строки for /? в выводе и Port name foo от них.
  • Указывая foo , мы разбиваем строку результата на пробелы и устанавливаем tokens=1,2,* в %%a , Port в %%b и name во все после (это то, что означает звездочка).

Возможно, вы захотите передать имя компьютера в качестве другой переменной.

Также обратите внимание, что это не обрабатывает случаи, когда не существует принтеров TCP/IP. Я предполагаю, что они просто ничего не сделают, так как тело цикла никогда не должно выполняться.


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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .