使用printui.exe时如何正确传递打印机名称参数?
解决批处理脚本中printui.exe无法识别打印机名称的问题
你的问题根源在于wmic printer get name的输出是Unicode格式,当for /f读取这些内容时,会在每个打印机名称末尾残留一个不可见的回车符(\r)。虽然echo %%a看起来显示正常,但这个隐藏的回车符会导致printui.exe无法正确识别打印机名称。
另外你的脚本还有两个小问题:
- 没有跳过
wmic输出的表头"Name",会多处理一次无效内容 - 打印机名称如果包含空格,直接传
%%a给printui.exe会被解析成多个参数,导致出错
下面提供两种可行的修复方案:
方案一:修复wmic输出的残留回车符
通过延迟扩展去除变量末尾的回车符,同时跳过表头、给名称加引号:
@echo off setlocal enabledelayedexpansion REM 循环遍历所有打印机名称,跳过表头行 for /f "tokens=* skip=1" %%a in ('wmic printer get name') do ( REM 去除变量末尾的回车符 set "printer=%%a" set "printer=!printer:~0,-1!" REM 跳过空行(wmic输出可能存在) if "!printer!"=="" goto :continue REM 判断是否为需要保留的打印机 echo !printer! | findstr /i "Microsoft OneNote" > nul if errorlevel 1 ( echo 删除打印机: !printer! printui.exe /dl /n "!printer!" ) :continue ) endlocal
方案二:改用PowerShell获取打印机名称(更简洁可靠)
PowerShell的输出没有Unicode残留问题,且语法更直观:
@echo off for /f "delims=" %%a in ('powershell -Command "Get-Printer | Select-Object -ExpandProperty Name"') do ( echo %%a | findstr /i "Microsoft OneNote" > nul if errorlevel 1 ( echo 删除打印机: %%a printui.exe /dl /n "%%a" ) )
两种方案都能解决你遇到的问题,方案二更适合复杂环境下的打印机名称处理。
内容的提问来源于stack exchange,提问作者Frist
相关产品推荐
相关产品推荐

