含WMIC命令的批处理在Win10教育版卡顿,专业版及CMD运行正常
Win10教育版管理员身份下批处理WMIC调用卡顿问题解决
问题原因
Win10教育版的管理员权限环境中,WMIC默认输出为UTF-16LE编码,而CMD的默认控制台编码为GBK(CP936)。当for /f通过管道读取WMIC输出时,编码不匹配会引发管道阻塞:单独执行WMIC时,CMD控制台会自动完成编码转换,但在for /f的子进程管道交互中,这种转换机制失效,导致WMIC进程无法完成输出写入,进而出现卡顿,强制终止后触发“进程尝试写入不存在的管道”错误。
解决方法
方法1:临时文件中转输出
绕过管道编码冲突,先将WMIC输出写入临时文件,再读取文件内容:
echo *************************************** echo * 1.Test mains connected echo * Mandatory for BIOS updates echo *************************************** set bstat= :: 将WMIC输出写入临时文件 wmic path Win32_Battery get BatteryStatus /format:list > "%temp%\batt_status.tmp" :: 从临时文件读取并提取值 for /f "tokens=2 delims==" %%a in ('find "=" "%temp%\batt_status.tmp"') do set bstat=%%a :: 删除临时文件 del "%temp%\batt_status.tmp" if [%bstat%]==[2] goto :charg
方法2:强制统一输出编码
通过cmd /u强制WMIC输出Unicode编码,解决管道编码不匹配问题:
echo *************************************** echo * 1.Test mains connected echo * Mandatory for BIOS updates echo *************************************** set bstat= for /f "tokens=2 delims==" %%a in ('cmd /u /c "wmic path Win32_Battery get BatteryStatus /format:list" ^| find "="') do set bstat=%%a if [%bstat%]==[2] goto :charg
方法3:替换为PowerShell调用(推荐,兼容未来版本)
PowerShell的Get-CimInstance在各Win10版本兼容性更好,管理员权限下无编码问题,也符合WMIC弃用后的替代方向:
echo *************************************** echo * 1.Test mains connected echo * Mandatory for BIOS updates echo *************************************** set bstat= for /f %%a in ('powershell -Command "(Get-CimInstance Win32_Battery).BatteryStatus"') do set bstat=%%a if [%bstat%]==[2] goto :charg
对于电池电量检查的卡顿问题,同样可以套用上述方法,比如临时文件方式:
set batlvl=25 set charge= wmic path win32_battery get estimatedchargeremaining /format:value > "%temp%\batt_charge.tmp" for /f "tokens=2 delims==" %%a in ('find "=" "%temp%\batt_charge.tmp"') do set charge=%%a del "%temp%\batt_charge.tmp" IF %charge% GTR %batlvl% ( :: 后续逻辑 )
内容的提问来源于stack exchange,提问作者calade
相关产品推荐
相关产品推荐

