如何获取打印机状态?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
相关产品推荐
相关产品推荐

