
标题: [系统相关] [已解决]批处理获取网卡名称win11专业版显示乱码。有没有通用的显示方式? [打印本页]
作者: ygqiang 时间: 2025-1-16 17:20 标题: [已解决]批处理获取网卡名称win11专业版显示乱码。有没有通用的显示方式?
本帖最后由 ygqiang 于 2025-1-24 15:21 编辑
win7x64和win10、win11家庭版显示正常。win11专业版显示乱码。有没有通用的显示方式?
bat 代码,固定使用ansi格式保存到文件- @echo off & setlocal enabledelayedexpansion
- echo 代码开始
-
- chcp 936 > nul
-
- REM 获取网卡名称
- for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
- set "str=%%a"
- for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
- )
-
- echo 网卡名称: "%interfaceName%"
- pause
复制代码
更新,经过测试如下:- @echo off & setlocal enabledelayedexpansion
- echo 代码开始
-
- echo 65001编码获取: > nul
- chcp 65001 >nul
-
- for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
- set "str=%%a"
- for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
- )
-
- rem 代码保存为ansi编码的bat文件--显示乱码
- rem 代码保存为编码utf-8编码的bat文件--正常
- echo,网卡名称: "%interfaceName%"
- pause
-
- chcp 936 > nul
- echo 936编码输出: > nul
-
- rem 代码保存为ansi编码的bat文件---正常
- rem 代码保存为编码utf-8编码的bat文件--显示乱码
- echo,网卡名称: "%interfaceName%"
- pause
复制代码
作者: Five66 时间: 2025-1-16 19:03
代码文件的编码保存为ansi或gbk或gb2312
区域设置那里取消勾选 "UTF-8提供全球语言支持"
作者: jiavip 时间: 2025-1-16 19:11
回复 1# ygqiang
win11专业版 没装,也没虚拟机!
但查错思路,一般都有这几种,
1,在出错的地方暂停PAUSE,
2,查看当前变量(SET)
3,涉及到乱码则查看当前脚本的编码(CHCP)
4,查看当前脚本的的编码,,,
5,千万不要觉得电脑是不讲理的,如果你有这样的概念,先怀疑自己的认知是不是不足以匹配当前的难度!
6,BUG是永远领先于补丁存在的,只区分是否被发现或则版本是否决定更新而已!
7,人的寿命是有限的,而宇宙的问题是永恒存在的。别在一个万分之的问题上耗费超过十分之的精力(说白了,就是:别钻牛角尖!),除非那问题能给你带来30%以上的收益,30%以上收益,杀人的买卖都有人做,例如:缅北!
,,授人与渔的思路,比赠与与鱼更可贵,希望你能成长!
作者: jiavip 时间: 2025-1-16 19:28
回复 1# ygqiang
忘记给你个解决思路了!
思路可以有几种,,,
1,先是在脚本里VER判断当前脚本运行的版本!针对不同系统和不同“可能”存在的已知问题下,区别对待运行命令。GOTO 执行
2,是借助通用写法,把复杂的问题简单化。脚本写得再复杂,首先先要达到目的,才考虑优化和简化问题,这是个主次问题!
3,额,暂时没想到怎么表达!,,核心概念是,换一下思路和方式,或许会发现新大陆!到时候你就是,哥伦布了,可以写进历史题材了!,,哈哈,幽默学说,年轻人放松点,开朗点!,,

作者: czjt1234 时间: 2025-1-16 20:52
不是24h2吧
作者: ygqiang 时间: 2025-1-17 08:05
回复 5# czjt1234
win11 24h2
ver版本是:10.0.26100.2033
作者: czjt1234 时间: 2025-1-17 08:26
本帖最后由 czjt1234 于 2025-1-18 10:40 编辑
24h2 的 ansi 是美国英语,而不是简体中文
要进行设置的
作者: ygqiang 时间: 2025-1-17 10:59
回复 7# czjt1234
在 哪里设置呢?
作者: jiavip 时间: 2025-1-18 05:27
回复 1# ygqiang
发现你最近很喜欢编写收集系统硬件信息的批处理嘛!
给你几个命令思路和例子,启发启发一下你的创意编写,,
slmgr.Vbs -dlv
slmgr.Vbs -dli
slmgr.Vbs -xpr- For /f "skip=1 tokens=1,* delims= " %%i in ('Cscript.exe //e:Vbscript //nologo %windir%\System32\slmgr.Vbs -xpr') do (Set "激活信息=%%j")
- For /f "tokens=1,2* delims=:" %%i in ('Cscript.exe //e:Vbscript //nologo %windir%\System32\slmgr.Vbs -dlv') do (Call,SET 名称=%%%%i&Call,SET 变量=%%%%j&Call,Set 名称=%%名称: =%%&Call,Set 变量=%%变量: =%%&Call,Set "%%名称%%=%%变量%%")
- SET
- PAUSE>NUL
复制代码
以上是注册信息,,大部分WIN系统支持,,
以下是 PC 硬件支持部分和系统一些个杂七杂八乱七八糟的信息,,
Systeminfo >Systeminfo.TXT
DxDiag /t >DxDiag.TXT
调用例子,,,,- DxDiag /t >%Temp%\DxDiag.TXT
- For /f "tokens=1,* delims= " %%i in ('Findstr /IC:"Description: " %Temp%\DxDiag.TXT') do (Set/a 声+=1&CALL,Set 声卡%%声%%=%%j&CALL,Set "输出声卡=%%声卡1%%")
- SET
- PAUSE>NUL
复制代码
这些都是我多年前一直编写系统硬件和系统信息相关脚本的野路子,
有些系统支持有些系统不支持,无非都是系统版本不同读取出错而已!
可以根据不同的系统版本前缀 IF 系统分类GOTO 到不同的命令调用,
早些时候我也喜欢写很多这类脚本。不过现在戒了,,,
作者: czjt1234 时间: 2025-1-18 14:34
回复 8# ygqiang
设置 - 时间和语言 - 管理语言设置 - 非 Unicode 程序的语言 - 更改系统区域设置
当前系统区域设置 - 简体中文(中国大陆) - 确定
然后会提示你重启
重启后,记事本中输入中文,另存为 ANSI 后再打开,显示正常就 ok 了
作者: ygqiang 时间: 2025-1-18 18:55
回复 10# czjt1234
看了下,这个所有的win中文系统,默认都是这个选项啊。不需要设置修改
作者: yakeyun 时间: 2025-1-21 12:30
回复 1# ygqiang - @echo off & setlocal enabledelayedexpansion
- chcp 936 > nul
- echo 936编码获取:
- REM 获取网卡名称
- for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
- set "str=%%a"
- for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
- )
- echo 网卡名称: "%interfaceName%"
-
- chcp 65001 >nul
- echo 65001编码获取:
- REM 获取网卡名称
- for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
- set "str=%%a"
- for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
- )
- echo 网卡名称: "%interfaceName%"
-
- pause
复制代码
哪个编码可以正常显示就用哪个,24H2就这样。
作者: trustbox 时间: 2025-1-21 14:54
我用iconv 转换
例如
wmic csproduct get uuid | iconv -f UTF-8 >> 本机信息.txt
echo ----------------------
echo ---------------------- >> 本机信息.txt
echo 获取当前电脑硬盘序列号
echo ----------------------
echo 当前电脑硬盘序列号: >> 本机信息.txt
wmic diskdrive get serialnumber | iconv -f UTF-8 >> 本机信息.txt
作者: ygqiang 时间: 2025-1-21 21:27
回复 12# yakeyun
不能智能判断文件的保持格式吗?
如果bat文件保存格式是ansi,代码就以936编码显示。
是utf-8格式,就以65001编码显示。
作者: yakeyun 时间: 2025-1-22 10:31
本帖最后由 yakeyun 于 2025-1-22 10:32 编辑
回复 14# ygqiang
24H2判断有问题,具体可以参考我前面发的贴子,ANSI文件被识别成了UTF-8导致出现乱码。所以对于需要混编输出的内容[比如批处理本身输出或者其他程序输出抓取等]可能需要随时切编码格式处理文本类容,不然会出现部分乱码的情况。
http://www.bathome.net/thread-70183-1-1.html
作者: ygqiang 时间: 2025-1-22 12:47
本帖最后由 ygqiang 于 2025-1-22 13:45 编辑


回复 ygqiang
24H2判断有问题,具体可以参考我前面发的贴子,ANSI文件被识别成了UTF-8导致出现乱码。 ...
yakeyun 发表于 2025-1-22 10:31 
Windows 11 专业版24h2 26100.2033,这个版本。
下面代码保存为ansi编码的bat文件,运行后。- @echo off & setlocal enabledelayedexpansion
-
- chcp 936 > nul
- echo 936编码获取:
-
- for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
- set "str=%%a"
- for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
- )
- echo 网卡名称: "%interfaceName%"
-
- pause
-
- chcp 65001 >nul
- echo 65001编码获取:
-
- for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
- set "str=%%a"
- for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
- )
- echo 网卡名称: "%interfaceName%"
-
-
-
- pause
复制代码
作者: Five66 时间: 2025-1-22 14:01
回复 16# ygqiang
额 ,这编码都不统一
不统一设就置成统一的
设置不了的就不要想着只用一种编码方式就能统一
总之参考下面的- @echo off & setlocal enabledelayedexpansion
-
- rem 代码保存为ansi编码的bat文件
-
- echo 65001编码获取:
- chcp 65001 >nul
- for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
- set "str=%%a"
- for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
- )
-
- chcp 936 > nul
- echo 936编码输出:
- echo 网卡名称: "%interfaceName%"
-
- pause
复制代码
作者: ygqiang 时间: 2025-1-22 17:17
回复 17# Five66
谢谢。
作者: czjt1234 时间: 2025-1-24 21:18
本帖最后由 czjt1234 于 2025-1-24 21:19 编辑
装了虚拟机测试,win11 24H2
已设置为默认 chcp 936- netsh interface show interface|more +3
复制代码
输出正常
- 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 测试通过
作者: ygqiang 时间: 2025-1-24 22:16
回复 19# czjt1234
1楼的代码基本可以满足要求。
手头的bat文件一般都是保存编码ansi格式。
作者: jiavip 时间: 2025-1-25 09:15
回复 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
)
作者: aloha20200628 时间: 2025-1-26 14:58
回复 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)落地即用,与批处脚本同目录- @echo off &setlocal enabledelayedexpansion
- for /f %%a in ('coder.exe -s -a gc -f "%~f0" ') do set "ec=%%a"
- if /i "%ec%"=="ansi" (set "_ec=00936") else set "_ec=65001"
- chcp %_ec%>nul
- set "p=当前码页:" &echo,!p!%_ec%
- for /f "tokens=4 delims= " %%a in (
- 'netsh interface show interface^|more +3'
- ) do set/a "n+=1" &set "_#!n!=网卡名称:%%a" &echo,网卡名称:%%a
- pause
- if /i "%ec%"=="ansi" (set "_ec=65001") else set "_ec=00936"
- chcp %_ec%>nul
- echo,!p!%_ec%
- for /f "tokens=1* delims==" %%a in ('set _#') do echo,%%b
- pause&exit/b
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |