标题: [文本处理] [已解决]请教批处理对于下列返回结果怎样提取数据最准确 [打印本页]
作者: xiaolijian916 时间: 2021-7-21 07:29 标题: [已解决]请教批处理对于下列返回结果怎样提取数据最准确
需求:获取本机中的显卡相关信息,如多个显卡则取默认取第一行即可,但是此处分辨率在第二行,因此没有采用.../value格式化,那么就带来个问题,用【delims= 】空格拆分时可能会导致意外的结果【如:显卡名称本身含有空格】
在不用.../value格式情况下如何正确提取5列的值【显卡内存、显卡名称、显卡版本、水平分辨率、垂直分辨率】
本机的查询返回结果列表(数据可能没对齐):- D:\work_related\Tools\Batch>wmic path Win32_VideoController get Name,AdapterRAM,DriverVersion,CurrentHorizontalResolution,CurrentVerticalResolution
- AdapterRAM CurrentHorizontalResolution CurrentVerticalResolution DriverVersion Name
- 2147483648 27.21.14.5709 NVIDIA GeForce 940MX
- 1073741824 1920 1080 27.20.100.8853 Intel(R) HD Graphics 630
复制代码
最终得到的值:
set Name=显卡名称
set AdapterRAM=显卡内存
set DriverVersion=显卡版本
set CurrentHorizontalResolution=水平分辨率
set CurrentVerticalResolution=垂直分辨率
示例代码:- for /f "skip=1 tokens=1-5 delims= " %%a in ('wmic path Win32_VideoController get Name^,AdapterRAM^,DriverVersion^,CurrentHorizontalResolution^,CurrentVerticalResolution') do (
-
-
- )
复制代码
作者: qixiaobin0715 时间: 2021-7-21 11:24
回复 1# xiaolijian916
未测试- @echo off
- set n=0
- set "m=wmic path Win32_VideoController get Name^,AdapterRAM^,DriverVersion^,CurrentHorizontalResolution^,CurrentVerticalResolution"
- setlocal enabledelayedexpansion
- for /f "skip=1 tokens=1-4*" %%a in ('%m%') do (
- echo,%%b| findstr /r "^[0-9][0-9]*$" >nul 2>&1
- if not errorlevel 1 (
- set CurrentHorizontalResolution=%%b&set CurrentVerticalResolution=%%c
- if !n! equ 0 set AdapterRAM=%%a&set DriverVersion=%%d&set Name=%%e
- ) else (
- if !n! equ 0 set AdapterRAM=%%a&set DriverVersion=%%b&set Name=%%c %%d %%e
- )
- set n=1
- )
- ::以下为验证是否赋值
- echo %Name%
- echo %AdapterRAM%
- echo %DriverVersion%
- echo %CurrentHorizontalResolution%
- echo %CurrentVerticalResolution%
- pause
复制代码
作者: newswan 时间: 2021-7-21 11:32
只有第五列包含空格的话- 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
根据测试得到的结果是:- 显存容量:2147483648
- 系统分辨率:27.21.14.5709*NVIDIA
- 显卡版本:GeForce
- 卡名称:940MX
复制代码
作者: xiaolijian916 时间: 2021-7-21 16:00
本帖最后由 xiaolijian916 于 2021-7-21 16:03 编辑
回复 xiaolijian916
未测试
qixiaobin0715 发表于 2021-7-21 11:24
测试结果正确的,但有个问题,取自格式写死了,其他机器的显卡名称空格不一定是两个或三个(其他4列应该是固定格式)。我的思路是将最后一列单独拿出来做处理。- NVIDIA GeForce 940MX
- 2147483648
- 27.21.14.5709
- 1920
- 1080
- 请按任意键继续. . .
复制代码
作者: xiaolijian916 时间: 2021-7-21 16:07
只有第五列包含空格的话
newswan 发表于 2021-7-21 11:32
测试结果:- Name
- 940MX
- Intel(R) HD Graphics 630
- 请按任意键继续. . .
复制代码
作者: 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
把显卡和显示分辨率分开呗- wmic path Win32_VideoController get Name,AdapterRAM,DriverVersion
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |