[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 ygqiang 于 2025-1-22 13:45 编辑




回复  ygqiang


24H2判断有问题,具体可以参考我前面发的贴子,ANSI文件被识别成了UTF-8导致出现乱码。 ...
yakeyun 发表于 2025-1-22 10:31



Windows 11 专业版24h2 26100.2033,这个版本。

下面代码保存为ansi编码的bat文件,运行后。
  1. @echo off & setlocal enabledelayedexpansion
  2. chcp 936 > nul
  3. echo 936编码获取:
  4. for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
  5.     set "str=%%a"
  6.     for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
  7. )
  8. echo 网卡名称: "%interfaceName%"
  9. pause
  10. chcp 65001 >nul
  11. echo 65001编码获取:
  12. for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
  13.     set "str=%%a"
  14.     for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
  15. )
  16. echo 网卡名称: "%interfaceName%"
  17. pause
复制代码

TOP

回复 16# ygqiang


   
额 ,这编码都不统一
不统一设就置成统一的
设置不了的就不要想着只用一种编码方式就能统一
总之参考下面的
  1. @echo off & setlocal enabledelayedexpansion
  2. rem 代码保存为ansi编码的bat文件
  3. echo 65001编码获取:
  4. chcp 65001 >nul
  5. for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
  6.     set "str=%%a"
  7.     for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
  8. )
  9. chcp 936 > nul
  10. echo 936编码输出:
  11. echo 网卡名称: "%interfaceName%"
  12. pause
复制代码
1

评分人数

TOP

回复 17# Five66

谢谢。

TOP

本帖最后由 czjt1234 于 2025-1-24 21:19 编辑

装了虚拟机测试,win11 24H2
已设置为默认 chcp 936
  1. netsh interface show interface|more +3
复制代码
输出正常

  1. for /f "delims=" %a in ('netsh interface show interface^|more +3') do @echo %a
复制代码
输出乱码

说明 for 命令始终按 UTF8 读取输入数据

目前看来只能把批处理另存为不带 BOM 的 UTF8
再把 chcp 936 改为 chcp 65001
在 win10 22H2 和 win11 24H2 测试通过
1

评分人数


QQ 20147578

TOP

回复 19# czjt1234


    1楼的代码基本可以满足要求。
手头的bat文件一般都是保存编码ansi格式。

TOP

回复 1# ygqiang

第9行可以改一下,用空格截取第3段好点,你现在这样写如果有意外长度,如果前缀字符超过46个字符,会把网卡名称的字符也截掉几个,或前缀字符不足46个会获取到有空格的网卡名称。现在用的是爪机,不好编辑,,,

for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
    set "str=%%a"
    for /f "tokens=3 delims= " %%b in ("!str!") do set interfaceName=%%b
)

TOP

回复 1# ygqiang

本帖与另帖(http://www.bathome.net/thread-70452-1-1.html)反复敲打的都与cmd这个功能有关 》即切换当前码页会导致被屏显的变量数据自动转换其编码为当前码页编码... 另帖中6楼代码据此功能示例了用纯批如何互转文本文件的简中/utf-8编码,同理,以下代码根据当前脚本编码的识别结果来即时切换码页以使变量数据得以正常屏显... 代码基于一个简化的假设即脚本文件的编码或是简中(ansi/gb2312)或是 utf-8;代码中调用的 coder.exe 可从本坛第三方下载(http://bcn.bathome.net/s/tool/index.html?key=coder)落地即用,与批处脚本同目录
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f %%a in ('coder.exe -s -a gc -f "%~f0" ') do set "ec=%%a"
  3. if /i "%ec%"=="ansi" (set "_ec=00936") else set "_ec=65001"
  4. chcp %_ec%>nul
  5. set "p=当前码页:" &echo,!p!%_ec%
  6. for /f "tokens=4 delims= " %%a in (
  7.   'netsh interface show interface^|more +3'
  8. ) do set/a "n+=1" &set "_#!n!=网卡名称:%%a" &echo,网卡名称:%%a
  9. pause
  10. if /i "%ec%"=="ansi" (set "_ec=65001") else set "_ec=00936"
  11. chcp %_ec%>nul
  12. echo,!p!%_ec%
  13. for /f "tokens=1* delims==" %%a in ('set _#') do echo,%%b
  14. pause&exit/b
复制代码

TOP

返回列表