web

Obtener lista de impresoras en Windows usando PHP

Introducción

Puede que en algún momento necesitemos obtener qué impresoras se encuentran disponibles para, obviamente, imprimir.

En esta ocasión veremos cómo obtener dicha lista usando el maravilloso lenguaje PHP y el powershell de Windows. Tranquilo, que no es nada complicado.

Nota: obviamente esto sólo funciona en Windows, y sólo si es 7, 8 o 10. (por cierto, ¿Quién usa XP o Vista en pleno 2017?)

Comando

Primero tenemos que saber en dónde se encuentra el powershell. Normalmente está en c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe. Vamos a abrirlo entonces y ejecutar el siguiente comando:

get-WmiObject -class Win32_printer |ft name

La verdad, no sé cómo funciona internamente. Pero sí que lista las impresoras:

Hasta aquí todo bien, el problema es que con PHP no podemos hacer lo mismo que hacemos con nuestras manos. Así que necesitamos un comando de una sola línea que ejecute todo.

Para ello, powershell acepta un comando como argumento con la opción -c. Por lo que podemos llamarlo desde el cmd así:

c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c "get-WmiObject -class Win32_printer |ft name"

No hay que confundirnos, simplemente indicamos la ruta de powershell, y le pasamos como argumento y entre comillas el comando que ejecutamos anteriormente. La salida es esta:

Es la misma de hace un momento, con la novedad de que la obtuvimos en un solo comando. Ahora sí estamos listos.

Llamando desde PHP

En PHP existe la función exec, que ejecuta un comando en la terminal del sistema. Así que básicamente tenemos que llamar a exec con el comando de arriba, parsear la salida, omitir “name” y los guiones que salen así como las líneas vacías, y finalmente mostrar el nombre de la impresora “limpio”.

Para ello he preparado un pequeño script:

<?php
    $ruta_powershell = 'c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'; #Necesitamos el powershell
    $opciones_para_ejecutar_comando = "-c";#Ejecutamos el powershell y necesitamos el "-c" para decirle que ejecutaremos un comando
    $espacio = " "; #ayudante para concatenar
    $comillas = '"'; #ayudante para concatenar
    $comando = 'get-WmiObject -class Win32_printer |ft name'; #Comando de powershell para obtener lista de impresoras
    $lista_de_impresoras = array(); #Aquí pondremos las impresoras
    exec(
        $ruta_powershell
        . $espacio
        . $opciones_para_ejecutar_comando
        . $espacio
        . $comillas
        . $comando
        . $comillas,
        $resultado,
        $codigo_salida);

    if ($codigo_salida === 0) {
        if (is_array($resultado)) {
            #Omitir los primeros 3 datos del arreglo, pues son el encabezado
            for($x = 3; $x < count($resultado); $x++){
                $impresora = trim($resultado[$x]);
                if (strlen($impresora) > 0) # Ignorar los espacios en blanco o líneas vacías
                    array_push($lista_de_impresoras, $impresora);
            }
        }
        echo "<pre>";
        print_r($lista_de_impresoras);
        echo "</pre>";
    } else {
        echo "Error al ejecutar el comando.";
    }
?>

Probando

¿Y funciona? claro que sí, tarda un poco, pero vale la pena. No puedo poner resultados en línea, pero aquí adjunto una captura de lo que aparece en mi sistema:

Y si voy al panel de control, son las mismas:

Si tú deseas probarlo, simplemente copia el código, pégalo, guárdalo en htdocs (si no sabes instalar PHP ya he escrito un tutorial aquí) y finalmente visita http://localhost/listar-todas-las-impresoras.php

Hasta aquí llegamos por hoy

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

5 días hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.