Board logo

标题: [文本处理] [已解决]请教批处理对于下列返回结果怎样提取数据最准确 [打印本页]

作者: xiaolijian916    时间: 2021-7-21 07:29     标题: [已解决]请教批处理对于下列返回结果怎样提取数据最准确

需求:获取本机中的显卡相关信息,如多个显卡则取默认取第一行即可,但是此处分辨率在第二行,因此没有采用.../value格式化,那么就带来个问题,用【delims= 】空格拆分时可能会导致意外的结果【如:显卡名称本身含有空格】
在不用.../value格式情况下如何正确提取5列的值【显卡内存、显卡名称、显卡版本、水平分辨率、垂直分辨率】

本机的查询返回结果列表(数据可能没对齐):
  1. D:\work_related\Tools\Batch>wmic path Win32_VideoController get Name,AdapterRAM,DriverVersion,CurrentHorizontalResolution,CurrentVerticalResolution
  2. AdapterRAM  CurrentHorizontalResolution  CurrentVerticalResolution  DriverVersion   Name
  3. 2147483648                                                          27.21.14.5709   NVIDIA GeForce 940MX
  4. 1073741824  1920                         1080                       27.20.100.8853  Intel(R) HD Graphics 630
复制代码
最终得到的值:
set Name=显卡名称
set AdapterRAM=显卡内存
set DriverVersion=显卡版本
set CurrentHorizontalResolution=水平分辨率
set CurrentVerticalResolution=垂直分辨率

示例代码:
  1. for /f "skip=1 tokens=1-5 delims= " %%a in ('wmic path Win32_VideoController get Name^,AdapterRAM^,DriverVersion^,CurrentHorizontalResolution^,CurrentVerticalResolution') do (
  2.    
  3.    
  4. )
复制代码

作者: qixiaobin0715    时间: 2021-7-21 11:24

回复 1# xiaolijian916
未测试
  1. @echo off
  2. set n=0
  3. set "m=wmic path Win32_VideoController get Name^,AdapterRAM^,DriverVersion^,CurrentHorizontalResolution^,CurrentVerticalResolution"
  4. setlocal enabledelayedexpansion
  5. for /f "skip=1 tokens=1-4*" %%a in ('%m%') do (
  6.     echo,%%b| findstr /r "^[0-9][0-9]*$" >nul 2>&1
  7.     if not errorlevel 1 (
  8.         set CurrentHorizontalResolution=%%b&set CurrentVerticalResolution=%%c
  9.         if !n! equ 0 set AdapterRAM=%%a&set DriverVersion=%%d&set Name=%%e
  10.     ) else (
  11.         if !n! equ 0 set AdapterRAM=%%a&set DriverVersion=%%b&set Name=%%c %%d %%e
  12.     )
  13.     set n=1
  14. )
  15. ::以下为验证是否赋值
  16. echo %Name%
  17. echo %AdapterRAM%
  18. echo %DriverVersion%
  19. echo %CurrentHorizontalResolution%
  20. echo %CurrentVerticalResolution%
  21. pause
复制代码

作者: newswan    时间: 2021-7-21 11:32

只有第五列包含空格的话
  1. for /f "tokens=1,2,3,4,*" %a in (' %cmdline% ') do echo %e
复制代码

作者: yakeyun    时间: 2021-7-21 13:15

本帖最后由 yakeyun 于 2021-7-25 19:40 编辑

回复 1# xiaolijian916

效果自测


@echo off
setlocal enabledelayedexpansion
for /f "skip=1 tokens=1-4,*" %%a in ('wmic "path" Win32_VideoController get Name^,AdapterRAM^,DriverVersion^,CurrentHorizontalResolution^,CurrentVerticalResolution') do (
If %%b == %%c (
echo,%%a %%b %%c >a1.ini
Goto p2
) else (
echo,%%a %%b %%c %%d %%e >a2.ini
goto p1
)
)
:p1
for /f "tokens=1-4,*" %%l in (a2.ini) do (
echo.
echo,显存容量:%%l
echo,系统分辨率:%%m*%%n
echo,显卡版本:%%o
echo,显卡名称:%%p
echo.
)
pause>nul
exit
:p2
for /f "tokens=1-2,*" %%h in (a1.ini) do echo,%%h %%i %%j
for /f "tokens=1-4,*" %%o in (a2.ini) do echo,%%o %%p %%q %%r %%s
echo.
echo,显存容量:%%h
echo,系统分辨率:%%o*%%p
echo,显卡版本:%%i
echo,显卡名称:%%j
echo.
pause>nul
exit

重新修改,独显核显都可以用:


@echo off
@if exist data2.ini del data2.ini
wmic "path" Win32_VideoController get name,AdapterRAM,DriverVersion,CurrentHorizontalResolution,CurrentVerticalResolution /format:csv >.\data1.ini
setlocal enabledelayedexpansion
for /f "skip=2 delims=, tokens=1,*" %%a in ('type ^"data1.ini^"') do (echo,%%b) >>.\data2.ini
@if exist data1.ini del data1.ini
::pause
for /f "delims=" %%c in ('more "data2.ini" ^| find ",,,"') do echo,%%c >.\p1.ini
for /f "delims=" %%c in ('more "data2.ini" ^| find ","') do echo,%%c >.\p2.ini
::pause
if not exist p1.ini goto 1XK
@find /I /C ",,," p1.ini > nul
@if %ERRORLEVEL% == 0 (
goto 2XK
) else (
goto 1XK
)
:1XK
echo 单显卡配置^:
for /f "delims=, tokens=1-4,*" %%h in (p2.ini) do (
set RL= %%h
if !RL! LEQ 1073741824 (set /a rl=RL/1024/1024) ELSE (set /a rl=RL/1024/1024+1)
echo.
echo,显存容量:!rl! MB
echo,系统分辨率:%%i*%%j
echo,驱动版本:%%k
echo,显卡名称:%%l
echo.
@del data2.ini
@del p2.ini
)
pause>nul
exit
:2XK
echo 双显卡配置^:
for /f "delims=, tokens=1-2,*" %%d in (p1.ini) do for /f "delims=, tokens=1-4,*" %%h in (p2.ini) do (
set RL= %%d
if !RL! LEQ 1073741824 (set /a rl=RL/1024/1024) ELSE (set /a rl=RL/1024/1024+1)
echo.
echo,显存容量:!rl! MB
echo,系统分辨率:%%i*%%j
echo,驱动版本:%%e
echo,显卡名称:%%f
echo.
@del data2.ini>nul
@del p1.ini>nul
@del p2.ini>nul
)
pause>nul
exit
作者: xiaolijian916    时间: 2021-7-21 15:58

回复 4# yakeyun


根据测试得到的结果是:
  1. 显存容量:2147483648
  2. 系统分辨率:27.21.14.5709*NVIDIA
  3. 显卡版本:GeForce
  4. 卡名称:940MX
复制代码

作者: xiaolijian916    时间: 2021-7-21 16:00

本帖最后由 xiaolijian916 于 2021-7-21 16:03 编辑
回复  xiaolijian916
未测试
qixiaobin0715 发表于 2021-7-21 11:24



    测试结果正确的,但有个问题,取自格式写死了,其他机器的显卡名称空格不一定是两个或三个(其他4列应该是固定格式)。我的思路是将最后一列单独拿出来做处理。
  1. NVIDIA GeForce 940MX
  2. 2147483648
  3. 27.21.14.5709
  4. 1920
  5. 1080
  6. 请按任意键继续. . .
复制代码

作者: xiaolijian916    时间: 2021-7-21 16:07

只有第五列包含空格的话
newswan 发表于 2021-7-21 11:32



    测试结果:
  1. Name
  2. 940MX
  3. Intel(R) HD Graphics 630
  4. 请按任意键继续. . .
复制代码

作者: qixiaobin0715    时间: 2021-7-21 16:35

回复 6# xiaolijian916
显卡名称含有2个及2个以上的空格,代码均能处理。1个空格或没有空格可能会出问题,我想这种情况极少,如果要处理这种情况,还需要增加判断语句,效率要差些,可对代码第11行进行修改。
作者: idwma    时间: 2021-7-21 16:40

像这样用逗号分开是不是就不用考虑空格的问题了
wmic path Win32_VideoController get Name,AdapterRAM,DriverVersion,CurrentHorizontalResolution,CurrentVerticalResolution /format:csv
作者: newswan    时间: 2021-7-21 18:49

把显卡和显示分辨率分开呗
  1. wmic path Win32_VideoController get Name,AdapterRAM,DriverVersion
  2. wmic path Win32_VideoController get CurrentHorizontalResolution,CurrentVerticalResolution
复制代码

作者: xiaolijian916    时间: 2021-7-21 20:57

回复 9# idwma


    这个不错,按照,拆分提取即可。
作者: xiaolijian916    时间: 2021-7-21 20:58

回复 10# newswan


    一个语句块执行两遍要被骂
作者: newswan    时间: 2021-7-21 21:55

回复 12# xiaolijian916


不分开才是错误的。显卡 和 分辨率 本来应该分开
作者: yakeyun    时间: 2021-7-24 09:04

本帖最后由 yakeyun 于 2021-7-25 19:41 编辑

回复 5# xiaolijian916


重新修改,独显核显都可以用:


@echo off
@if exist data2.ini del data2.ini
wmic "path" Win32_VideoController get name,AdapterRAM,DriverVersion,CurrentHorizontalResolution,CurrentVerticalResolution /format:csv >.\data1.ini
setlocal enabledelayedexpansion
for /f "skip=2 delims=, tokens=1,*" %%a in ('type ^"data1.ini^"') do (echo,%%b) >>.\data2.ini
@if exist data1.ini del data1.ini
for /f "delims=" %%c in ('more "data2.ini" ^| find ",,,"') do echo,%%c >.\p1.ini
for /f "delims=" %%c in ('more "data2.ini" ^| find ","') do echo,%%c >.\p2.ini
if not exist p1.ini goto 1XK
@find /I /C ",,," p1.ini > nul
@if %ERRORLEVEL% == 0 (
goto 2XK
) else (
goto 1XK
)
:1XK
echo 单显卡配置^:
for /f "delims=, tokens=1-4,*" %%h in (p2.ini) do (
set RL= %%h
if !RL! LEQ 1073741824 (set /a rl=RL/1024/1024) ELSE (set /a rl=RL/1024/1024+1)
echo.
echo,显存容量:!rl! MB
echo,系统分辨率:%%i*%%j
echo,驱动版本:%%k
echo,显卡名称:%%l
echo.
@del data2.ini
@del p2.ini
)
pause>nul
exit
:2XK
echo 双显卡配置^:
for /f "delims=, tokens=1-2,*" %%d in (p1.ini) do for /f "delims=, tokens=1-4,*" %%h in (p2.ini) do (
set RL= %%d
if !RL! LEQ 1073741824 (set /a rl=RL/1024/1024) ELSE (set /a rl=RL/1024/1024+1)
echo.
echo,显存容量:!rl! MB
echo,系统分辨率:%%i*%%j
echo,驱动版本:%%e
echo,显卡名称:%%f
echo.
@del data2.ini>nul
@del p1.ini>nul
@del p2.ini>nul
)
pause>nul
exit




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2