Um problema que você terá é que o nome da porta é texto livre: pode ser praticamente qualquer coisa; não é garantido que seja o endereço IP. A menos que você tenha certeza de que as pessoas que configuram as impressoras definem explicitamente os nomes para começar com IP_
, isso não é garantido.
Eu recomendaria usar o PowerShell se você puder; os cmdlets Get-PrinterPort
e Set-PrinterProperty
ou talvez Set-PrintConfiguration
( documentos do Win10 , Documentos do Win8 , Documentos do Win8.1 ) são muito úteis. Infelizmente, eles são disponíveis apenas no Windows 8 ou Server 2012 e mais recentes . Eu só tenho acesso ao Windows 7 no momento e não posso testá-los.
Caso contrário, você pode usar prnport
diretamente, em vez de passar por prnmngr
primeiro. prnport -l
irá "listar todas as portas TCP". Se você usar isso em conjunto com um script semelhante ao de David, você terá os resultados corretos:
NB: Pode ser necessário substituir as invocações prnport
por cscript %windir%\System32\Printing_Admin_Scripts\en-US\prnport.vbs
, dependendo da sua configuração. Além disso, a região en-US
pode mudar.
for /f "tokens=1,2,*" %%a in ('prnport -s computer-01 -l ^| find "Port name"') do (
prnport -t -s computer-01 -r "%%c" -md
)
Breve explicação:
- Este é um loop
for
expandido. Vejafor /?
para detalhes. - Estamos passando por todos
Port name foo
linhas na saída e tirandofoo
deles. - Especificando
tokens=1,2,*
, nós tokenizamos a sequência de resultado por espaços e definimos%%a
aPort
,%%b
aname
e%%c
para tudo depois (é isso que o asterisco significa).
Você provavelmente desejará passar o nome do computador como outra variável.
Observe também que isso não controla casos em que não existem impressoras TCP / IP. Eu suponho que eles não farão nada, já que o corpo do loop nunca deve ser executado.
Outra opção é usar o WMI diretamente, que é o que os scripts de gerenciamento da impressora fazem sob o capô.