返回列表 发帖
本帖最后由 qixiaobin0715 于 2021-11-2 11:07 编辑

回复 1# gyue
更直接一些:
@echo off
for /f "tokens=1,2*" %%a in (硬件报告.txt) do (
    if "%%a"=="系统:" (
        echo,系统
        set n=0
    ) else if "%%b"=="设备信息:" (
        echo,
        echo,ATA
        set n=0
    ) else if "%%a"=="网络适配器信息:" (
        echo,
        echo,网络
        set n=0
    ) else if defined n (
        if "%%a"=="产品" (
            echo,产品型号:%%b %%c
        ) else if "%%a"=="型号" (
            echo,%%a %%b%%c
        ) else if "%%a"=="网络适配器" (
            echo,%%a%%b %%c
        ) else if "%%a"=="接口类型" (
            echo,%%a%%b %%c
        ) else if "%%a"=="序列号" (
            echo,%%a%%b
            set n=
        ) else if "%%a"=="硬件地址(MAC)" (
            echo,%%a%%b
            set n=
        )
    )
)
pauseCOPY

TOP

修正一下13楼代码,排除虚拟网卡信息:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2*" %%a in (硬件报告.txt) do (
    if "%%a"=="系统:" (
        echo,系统
        set n=0
    ) else if "%%b"=="设备信息:" (
        echo,
        echo,ATA
        set n=0
    ) else if "%%a"=="网络适配器信息:" (
        set n=0
    ) else if defined n (
        if "%%a"=="产品" (
            echo,产品型号:%%b %%c
        ) else if "%%a"=="型号" (
            echo,%%a %%b%%c
        ) else if "%%a"=="网络适配器" (
            set str=%%c
            set str=!str:Virtual=!
            set str=!str:Bluetooth=!
            if not "!str!"=="%%c" set n=
            if "%%b"=="Bluetooth" set n=
            if defined n (
                echo,
                echo,网络
                echo,%%a%%b %%c
            )
        ) else if "%%a"=="接口类型" (
            echo,%%a%%b %%c
        ) else if "%%a"=="序列号" (
            echo,%%a%%b
            set n=
        ) else if "%%a"=="硬件地址(MAC)" (
            echo,%%a%%b
            set n=
        )
    )
)
pauseCOPY

TOP

回复 15# gyue
你要增加内存的什么信息。我可以试试。

TOP

本帖最后由 qixiaobin0715 于 2021-11-3 21:23 编辑

回复 18# gyue
要输出文本到桌面,请将14楼代码for的前面加上一个英文左括号,代码39行修改为:
))>"%HomePath%\DeskTop\New_硬件报告.txt"COPY
即可。
在3~4行之间增加以下代码:
    if "%%a"=="内存设备:" (
        echo,
        echo,内存
        set m=0
    ) else if defined m (
        echo,%%a|findstr /xr "类型 大小 最大时钟频率 制造商 序列号 部件号">nul 2>nul&&echo,%%a%%b
        if "%%a"=="部件号" set m=
    )COPY
以上未经测试,请自行测试。

TOP

回复 20# gyue
你应当没有理解我的意思,好吧,给你一个完整代码:
@echo off
setlocal enabledelayedexpansion
(for /f "tokens=1,2*" %%a in (硬件报告.txt) do (
    if "%%a"=="内存设备:" (
        echo,
        echo,内存
        set m=0
    ) else if defined m (
        echo,%%a|findstr /xr "类型 大小 最大时钟频率 制造商 序列号 部件号">nul 2>nul&&echo,%%a%%b
        if "%%a"=="部件号" set m=
    )
    if "%%a"=="系统:" (
        echo,系统
        set n=0
    ) else if "%%b"=="设备信息:" (
        echo,
        echo,ATA
        set n=0
    ) else if "%%a"=="网络适配器信息:" (
        set n=0
    ) else if defined n (
        if "%%a"=="产品" (
            echo,产品型号:%%b %%c
        ) else if "%%a"=="型号" (
            echo,%%a %%b%%c
        ) else if "%%a"=="网络适配器" (
            set str=%%c
            set str=!str:Virtual=!
            set str=!str:Bluetooth=!
            if not "!str!"=="%%c" set n=
            if "%%b"=="Bluetooth" set n=
            if defined n (
                echo,
                echo,网络
                echo,%%a%%b %%c
            )
        ) else if "%%a"=="接口类型" (
            echo,%%a%%b %%c
        ) else if "%%a"=="序列号" (
            echo,%%a%%b
            set n=
        ) else if "%%a"=="硬件地址(MAC)" (
            echo,%%a%%b
            set n=
        )
    )
))>"%HomePath%\DeskTop\New_硬件报告.txt"
pauseCOPY
实际上上面增加的代码效率不高,运行时可能会有停顿的现象,因为在for循环里面使用了管道及组合命令。抽空给你再修改一下。

TOP

去掉了代码中的管道及组合命令,重新调整了判断逻辑,将类似项目放在同一个判断语句中,如果全部单独判断(你给定的关键词较多)代码就会太长,并且影响效率。用到了临时文件,最后结果中:“系统”中多了一行“制造商”信息。
@echo off
set "var=网络适配器 设备信息: 系统: 内存设备: 类型 大小 最大时钟频率 制造商 序列号 部件号 硬件地址 型号 产品"
findstr /r "%var%" 硬件报告.txt>a.log
setlocal enabledelayedexpansion
(for /f "tokens=1,2*" %%a in ('findstr /r /v "Virtual Bluetooth 类型详情" a.log') do (
    if "%%a"=="内存设备:" (
        echo,
        echo,内存
        set m=0
        set n=0
    ) else if "%%a"=="系统:" (
        echo,系统
        set n=0
    ) else if "%%b"=="设备信息:" (
        echo,
        echo,ATA
        set n=0
    ) else if "%%a"=="网络适配器" (
        echo,
        echo,网络
        echo,%%a%%b %%c
        set n=0
    ) else if defined n (
        if "%%a"=="序列号" (
            echo,%%a%%b
            if not defined m set n=
        ) else if "%%a"=="部件号" (
            echo,%%a%%b
            set m=
            set n=
        ) else if "%%a"=="硬件地址(MAC)" (
            echo,%%a%%b
            set n=
        ) else if "%%a"=="型号" (
            echo,%%a %%b%%c
        ) else (
            if "%%c"=="" (echo,%%a%%b) else echo,%%a%%b %%c
        )
    )
))>"%HomePath%\DeskTop\New_硬件报告.txt"
del a.log
pauseCOPY

TOP

修正了21楼大小和频率中只有数值没有单位的缺陷。
实际上不使用变量延迟也行,即删除上面代码第4行,结果是一样的。
“系统”中多了一行“制造商”信息的问题实际上也能解决,就是要增加判断。

TOP

本帖最后由 qixiaobin0715 于 2021-11-5 11:06 编辑

完全按照楼主要求的信息输出:
@echo off
set "var=网络适配器 设备信息: 系统: 内存设备: 类型 大小 最大时钟频率 制造商 序列号 部件号 硬件地址 型号 产品"
findstr /r "%var%" 硬件报告.txt>a.log
(for /f "tokens=1,2*" %%a in ('findstr /r /v "Virtual Bluetooth 类型详情" a.log') do (
    if "%%a"=="内存设备:" (
        echo,
        echo,内存
        set m=0
        set n=0
    ) else if "%%a"=="系统:" (
        echo,系统
        set n=0
        set l=0
    ) else if "%%b"=="设备信息:" (
        echo,
        echo,ATA
        set n=0
    ) else if "%%a"=="网络适配器" (
        echo,
        echo,网络
        echo,%%a%%b %%c
        set n=0
    ) else if defined n (
        if "%%a"=="序列号" (
            echo,%%a%%b
            if not defined m set n=
        ) else if "%%a"=="部件号" (
            echo,%%a%%b
            set m=
            set n=
        ) else if "%%a"=="硬件地址(MAC)" (
            echo,%%a%%b
            set n=
        ) else if "%%a"=="型号" (
            echo,%%a %%b%%c
        ) else if "%%a"=="制造商" (
            if defined l (set l=) else (if "%%c"=="" (echo,%%a%%b) else echo,%%a%%b %%c)
        ) else (
            if "%%c"=="" (echo,%%a%%b) else echo,%%a%%b %%c
        )
    )
))>"%HomePath%\DeskTop\New_硬件报告.txt"
del a.log
pauseCOPY

TOP

插槽:2
中数据是从141行取值的,是吗?

TOP

本帖最后由 qixiaobin0715 于 2021-11-8 16:42 编辑
@echo off
set "var=处理器: PCI/AGP 内存阵列: 网络适配器 设备信息: 系统: 类型 大小 最大时钟频率 制造商 序列号 部件号 硬件地址 型号 产品 最大内存容量 内存设备 设备描述 版本 显示适配器"
findstr /i /r /v /c:"类型[^ ]" /c:"[^ ]版本" /c:"DAC" ret.txt>b.log
findstr /r "%var%" b.log>a.log
(for /f "tokens=1,2*" %%a in ('findstr /r /v "Virtual Bluetooth 芯片类型" a.log') do (
    if "%%a"=="内存设备:" (
        echo,
        echo,内存
        set m=0
        set n=0
    ) else if "%%a"=="系统:" (
        echo,系统
        set n=0
    ) else if "%%b"=="设备信息:" (
        echo,
        echo,ATA
        set n=0
    ) else if "%%a"=="网络适配器" (
        echo,
        echo,网络
        echo,%%a%%b %%c
        set n=0
    ) else if "%%a"=="内存阵列:" (
        echo,
        echo,%%a
        set n=0
    ) else if "%%a"=="显示适配器:" (
        echo,
        echo,%%a
        set n=0
    ) else if "%%b"=="PCI/AGP" (
        echo,
        echo,%%b
        set n=0
    ) else if "%%a"=="处理器:" (
        echo,
        echo,%%a
        set n=0
    ) else if defined n (
        if "%%a"=="序列号" (
            echo,%%a%%b
            if not defined m set n=
        ) else if "%%a"=="部件号" (
            echo,%%a%%b
            set m=
            set n=
        ) else if "%%a"=="硬件地址(MAC)" (
            echo,%%a%%b
            set n=
        ) else if "%%a"=="内存设备" (
            echo,%%a%%b
            set n=
        ) else if "%%a"=="显存大小" (
            echo,%%a%%b %%c
            set n=
        ) else if "%%a"=="版本" (
            echo,%%a%%b %%c
            set n=
        ) else if "%%a"=="型号" (
            echo,%%a %%b%%c
        ) else (
            if "%%c"=="" (echo,%%a%%b) else echo,%%a%%b %%c
        )
    )
))>"%HomePath%\DeskTop\New_ret.txt"
del a.log
del b.log
pauseCOPY

TOP

PCI/AGP中数据不好处理,有差异,请手动将冒号修改为空格。

TOP

回复 29# gyue
现在应当可以了,请测试。

TOP

我测试的结果:
系统
制造商:HP
产品:OMEN by HP Laptop 15-dc0xxx
序列号:5CD9156840
处理器:
制造商:Intel(R) Corporation
版本:Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
内存阵列:
最大内存容量:32 GB
内存设备:2
内存
类型:DDR4
大小:8 GB
最大时钟频率:2667 MT/s
制造商:Samsung
序列号:310623C4
部件号:M471A1K43CB1-CTD
内存
类型:DDR4
大小:8 GB
最大时钟频率:2667 MT/s
制造商:Samsung
序列号:41E1ECAD
部件号:M471A1K43CB1-CTD
显示适配器:
设备描述:GeForce GTX 1050 Ti
显存大小:4 GB
显示适配器:
设备描述:GeForce GTX 1050 Ti
显存大小:4 GB
显示适配器:
设备描述:GeForce GTX 1050 Ti
显存大小:4 GB
显示适配器:
设备描述:GeForce GTX 1050 Ti
显存大小:4 GB
显示适配器:
设备描述:Intel(R) UHD Graphics 630
显存大小:1 GB
显示适配器:
设备描述:Intel(R) UHD Graphics 630
显存大小:1 GB
显示适配器:
设备描述:Intel(R) UHD Graphics 630
显存大小:1 GB
PCI/AGP
Intel:UHD Graphics 630                                                            显示适配器
ATA
型号 ID:INTEL SSDPEKKF256G8L
序列号:BTHH83940JXM256B
ATA
型号 ID:ST2000LM007-1R8174
序列号:WDZV90NZ
网络
网络适配器:Intel(R) Wireless-AC 9560 160MHz
接口类型:802.11 Wireless Ethernet
硬件地址(MAC):A8-6D-AA-72-7D-EC
网络
网络适配器:Realtek Gaming GbE Family Controller
接口类型:Ethernet
硬件地址(MAC):C4-65-16-AC-A7-11
请按任意键继续. . .COPY

TOP

回复 35# gyue
你把测试出现问题的文本发给我看看。

TOP

回复 38# gyue
请不要压缩,我这里.7z压缩文件没装软件,无法解压。

TOP

返回列表