[BATCH] Ayuda para generar listas con impresoras

Iniciado por Hekaly, 17 Octubre 2012, 11:29 AM

0 Miembros y 2 Visitantes están viendo este tema.

Hekaly

Hola, buenos dias a todos.

Estoy haciendo un script para gestionar impresoras , y la primera parte que quiero hacer es que se genere un listado de las que ya estan instaladas y que el usuario elija cual quiera configurar, borrar, etc.

Lo que me gustaria que salga es de la siguinte forma.

1. Impresora 1
2. Impresora 2
3. Impresora 3
.
.
.

El listado de impresoras se como sacarlo, de la siguente manera.
cscript prnmngr.vbs -l | find "Nombre de impresora"

Esto me saca un numero x de impresoras, y el tema que queiro saber es que el script me genere un menu con tantas optiones como impresoras tenga.

Osea seria hacerla con un for y que por cada impresora (que se saca del comando anterior) cree una opcion, pero como haria que se creen tambien x comprobaciones (set si %option%==1 tal impresora, si es 2 otra, etc....) se puede generar set dentro de for?? , deberia hacer un enableextension o disableenableextensions???

Espero que me puedan ayudar, muchas gracias.

Eleкtro

Cita de: Hekaly en 17 Octubre 2012, 11:29 AM
El listado de impresoras se como sacarlo, de la siguente manera.
cscript prnmngr.vbs -l | find "Nombre de impresora"
Cita de: Hekaly en 17 Octubre 2012, 11:29 AMpor cada impresora (que se saca del comando anterior) cree una opcion

No dispongo de ese archivo VBS, si puedes poner el output completo quizás puedo ayudarte a hacer el for "a ojo"...

Cita de: Hekaly en 17 Octubre 2012, 11:29 AMse puede generar set dentro de for??
si
Cita de: Hekaly en 17 Octubre 2012, 11:29 AMdeberia hacer un enableextension o disableenableextensions???
Setlocal enabledelayedexpansion
aunque hay otras formas.

saludos








Hekaly

Gracias EleKtro H@cker por la respuesta.

La verdad es que me estoy liando con el for, cuando uso el comando para listar las impresoras me sale esto...



Esta imagen la gereno con esta sentencia.

FOR /f "tokens=*" %%a in ('cscript prnmngr.vbs -l ^| find "Nombre de impresora"') DO (echo %%a)

La idea es que salga solo el nombre de la impresora, pero si pongo.

FOR /f "tokens=4*" %%a in ('cscript prnmngr.vbs -l ^| find "Nombre de impresora"') DO (echo %%a)

Solo me mustra la primera palabra del nombre de la impresora.



Pero poniendo "tokens=4*" o "tokens=4,5,6" o "tokens=4* delims=, " etc npo funciona, me sale solo el primer nombre.

Como puedo solucionarlo??, es por la tuberia ^| ??



Eleкtro

claro te estás comiendo un token, solo estás mostrando el token "4", prueba así:

Código (dos) [Seleccionar]
FOR /F "tokens=3,*" %%a in ('cscript prnmngr.vbs -l ^| find "Nombre de impresora"') DO (echo %%b)

saludos








Hekaly

Gracias de nuevo.

Lo de "tokens=4,*" se me habria pasado al poner la coma, pero lo que no sabia que hay que %%a  y luego %%b osea que no son las letras igual.

Ahora voy a ver si puedo crear los if %option% y set para comprobarlos y redirigir el codigo para cada impresora.

Si  tengo mas dudas preguntare por aqui.

Hekaly

#5
Hola de nuevo.

Vengo pidiendo mas ayuda para crear las listas. He estado un par de dias haciendo otras partes del script, como cambiar propiedades de impresoras, realizar backup de propiedades, restaurar, cambiar puertos, crearlos etc, pero ha llegado la hora de generar las listas y ahi me surgen los problemas.

El objetivo que tengo en mente es que cuando me aparezca el nombre de todas las impresoras pueda elegir una de ellas, esto lo hago con un set

set /p opcion="Elige una impresora: "

Pero claro para distinguir que impresora elijo de la lista mi idea es crear lo siguiente

[1] --- Impresora 1
[2] --- Impresora 2
[3] --- Impresora 3

Que al poner un numero haga una comprobacion

if %opcion% EQU 1 (XXXXXXXXX) else (XXXXXXX)
if %opcion% EQU 2 (XXXXXXXXX) else (XXXXXXX)
if %opcion% EQU 3 (XXXXXXXXX) else (XXXXXXX)


Ahi viene mi problema no se como crear esto.

Empiezo con intentar que en cada impresora salga un numero correspondiente, pense en un contador, pero lo maximo que consigo es que me salga de esta forma

[1] --- Impresora 1
[1] --- Impresora 2
[1] --- Impresora 3

Osa siempre el mismo numero

Uso esto.
FOR /F "tokens=3,*" %%a in ('cscript prnmngr.vbs -l ^| find "Nombre de impresora"') DO set /a impresoras=1+impresoras
echo [%impresoras%] --> %%b


Para mostrar la lista

Donde previamente he inicializado un contador a 1 al principio del script

set /a impresoras=1

Pero como he dicho antes solo me sale un numero, he probado a usar el for con parentesis y sin parentesis (salen cosas distintas, pero no se por que), en usar el comando con !! en vez de %% ya que uo un set dentro de un for (perviamente tengo setlocal enabledelayedexpansion)

Ademas que no se como puedo generar los set %opcion% EQU 1 ...
Como no me salia pense que si solo elijo una impresora el nombre se guarda en variable y ya puedo trabajar con ella, por lo que no haria falta escribir tantas comprobaciones como impresoras tenga.

La pregunta es, como puedo hacer esto, es decir, escribir el numero de la lista en vez de tener que escribir el nombre completo de la impresora???

Espero haberme expresado bien, muchas gracias por vuestra ayuda.

Eleкtro

#6
Como ya te dije no dispongo del vbs para testear así que estos códigos los hago "a ojo", esto debería funcionar, sinó, modificalo un poco para arreglarlo:

Código (dos) [Seleccionar]
@Echo OFF

:: By Elektro H@cker

REM FOR %%a in (pepe manolo elektro elhacker.net) DO (
REM Set /A "NUM+=1"
REM Call Set "Impresora%%NUM%%=%%a"
REM )

FOR /F "tokens=3,*" %%a in ('cscript prnmngr.vbs -l ^| find "Nombre de impresora"') DO (
Set /A "NUM+=1"
Call Set "Impresora%%NUM%%=%%b"
)

For /L %%a in (1,1,%NUM%) DO (
Call Set "choices=%%choices%%%%a"
Echo: [%%a] Impresora: %%Impresora%%a%% | MORE
)

choice /C %CHOICES% /M "elige una impresora >> "

Echo: Has elegido la impresora "%%IMPRESORA%ERRORLEVEL%%%" | MORE

Pause&Exit


Te debería salir algo así:



PD: si no te sale, examina con detalle los tokens del primer FOR, ahí estará el problema y la solución...

Saludos.