PowerShell中Out-Printer将ASCII 0x1B转为0x2E的原因咨询
问题原因及解决方法
核心原因
PowerShell的Out-Printer cmdlet并非直接向打印机端口发送原始字节,而是通过Windows打印子系统传递内容。即便使用Generic/Text Only驱动,打印子系统仍可能对字符串中的控制字符(如ESC 0x1B)进行转码或替换——这里0x1B被转换成了ASCII码0x2E(英文句号.),导致最终发送到COM9的内容变成2e 63。
而VB.NET和PuTTY是直接与COM端口建立原始字节流连接,绕过了Windows打印子系统的字符处理逻辑,因此能正确发送1B 63。
解决办法
要在PowerShell中直接发送原始控制指令到打印机端口,需绕过Out-Printer,直接操作串口或端口路径:
- 使用.NET的
System.IO.Ports.SerialPort类发送原始字节:
$port = New-Object System.IO.Ports.SerialPort("COM9", 9600, "None", 8, "One") $port.Open() $port.Write([byte[]]@(0x1B, 0x63), 0, 2) $port.Close()
注意:需根据打印机实际参数调整波特率、奇偶校验等配置
- 直接写入打印机端口路径:
$portPath = "\\.\COM9" $fileStream = [System.IO.File]::OpenWrite($portPath) $fileStream.Write([byte[]]@(0x1B, 0x63), 0, 2) $fileStream.Close()
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

