You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取打印机状态?Laravel中检查打印机在线/离线遇问题

解决Laravel中通过Shell命令检查Windows打印机在线状态的问题

问题背景

现有基于Mike42\Escpos的Laravel打印控制器可正常打印ZPL代码,但需要检查打印机的在线/离线状态。由于Mike42库无对应方法,尝试用shell_exec执行PowerShell命令查询Win32_Printer时无输出,但执行ipconfig等基础命令正常。

解决办法

1. 明确调用PowerShell执行命令

shell_exec默认使用CMD环境,直接执行PowerShell语法会失败,需要显式指定启动PowerShell并传递命令:

$printerName = "ZDesigner ZD230-203dpi ZPL";
// 构建PowerShell命令,处理变量转义
$command = 'powershell.exe -Command "Get-WmiObject -Query \'SELECT * FROM Win32_Printer WHERE Name = \"' . addslashes($printerName) . '\"\' | Select-Object -Property Name, PrinterStatus, WorkOffline | ConvertTo-Json"';
$result = shell_exec($command);

2. 处理打印机名称转义

打印机名称包含空格或特殊字符时,用addslashes()处理变量,避免命令语法错误。

3. 配置Web服务器账号权限

运行Laravel的Web服务器(如IIS)执行账号需要拥有WMI访问权限,否则会因权限不足无法查询打印机状态,需在服务器上为该账号添加WMI读取权限。

4. 解析命令输出

将命令结果转为JSON格式,PHP可直接解析为数组判断状态:

if ($result) {
    $printerInfo = json_decode($result, true);
    // PrinterStatus=3表示正常,WorkOffline=False表示在线
    $isOnline = ($printerInfo[0]['PrinterStatus'] == 3 && !$printerInfo[0]['WorkOffline']);
    if ($isOnline) {
        // 执行打印逻辑
    } else {
        return response()->json(['message' => '打印机处于离线状态'], 400);
    }
} else {
    return response()->json(['message' => '无法查询打印机状态'], 500);
}

整合后的完整控制器示例

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
use Mike42\Escpos\Printer;

class PrintBarCodeController extends Controller
{
    public function printBarcode(Request $request)
    {
        try {
            $printerName = "ZDesigner ZD230-203dpi ZPL";
            // 检查打印机状态
            $statusCheck = $this->checkPrinterStatus($printerName);
            if (!$statusCheck['online']) {
                return response()->json([
                    'message' => '打印机离线:' . $statusCheck['reason']
                ], 400);
            }

            $connector = new WindowsPrintConnector($printerName);
            $printer = new Printer($connector);

            $zplCode = "90809283048";
            $printer->textRaw($zplCode);
            $printer->cut();
            $printer->close();

            return response()->json([
                'message' => 'ZPL code printed successfully'
            ], 200);
        } catch (\Exception $e) {
            return response()->json([
                'message' => 'Error printing ZPL code: ' . $e->getMessage()
            ], 500);
        }
    }

    private function checkPrinterStatus($printerName)
    {
        $command = 'powershell.exe -Command "Get-WmiObject -Query \'SELECT * FROM Win32_Printer WHERE Name = \"' . addslashes($printerName) . '\"\' | Select-Object -Property Name, PrinterStatus, WorkOffline | ConvertTo-Json"';
        $result = shell_exec($command);

        if (!$result) {
            return [
                'online' => false,
                'reason' => '无法连接到WMI服务或打印机不存在'
            ];
        }

        $printerInfo = json_decode($result, true);
        if (empty($printerInfo)) {
            return [
                'online' => false,
                'reason' => '未找到指定打印机'
            ];
        }

        // Win32_Printer状态:3=正常,7=离线;WorkOffline为False表示在线
        $isOnline = ($printerInfo[0]['PrinterStatus'] == 3 && !$printerInfo[0]['WorkOffline']);
        $reason = $isOnline ? '' : ($printerInfo[0]['WorkOffline'] ? '打印机已设置为离线' : '打印机状态异常');

        return [
            'online' => $isOnline,
            'reason' => $reason
        ];
    }
}

内容的提问来源于stack exchange,提问作者JInx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:50:05