批量无法显示带有两个视频芯片的笔记本电脑的两个视频图形信息

问题描述 投票:0回答:2

我可以显示基本笔记本电脑的视频图形信息,但如果笔记本电脑有两个视频芯片,则无法成功,例如英特尔和英伟达。如果我在命令提示符窗口中运行命令行:

wmic.exe path Win32_VideoController get CurrentHorizontalResolution^, CurrentVerticalResolution^, Name^ /^format:value

我得到:

CurrentHorizontalResolution=
CurrentVerticalResolution=
Name=NVIDIA Quadro M1000M


CurrentHorizontalResolution=1920
CurrentVerticalResolution=1080
Name=Intel(R) HD Graphics 530

我的代码是:

set cmdlin="%SystemRoot%\System32\wbem\wmic.exe path Win32_VideoController get CurrentHorizontalResolution^,CurrentVerticalResolution^,Name^/format:value"

for /F "tokens=2-4 delims== skip=2" %%i in ('%cmdlin%') do (
    for /F %%j in ("%%i") do (
    set VresH=%%i
    set VresV=%%j
    set Vname=%%k
    ECHO Res.H: %VresH% - Res.V:%VresV% - Graphics: %Vname%
    )
)

我尝试过各种回显但没有成功。我可以看到用

echo on
输入变量的值,但没有显示...

有人可以帮助解决这个问题并解释我的错误,特别是如果请求的字段包含多个以空格分隔的项目,如何处理?

batch-file video
2个回答
0
投票

可以使用以下批处理文件代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if exist %SystemRoot%\System32\wbem\wmic.exe goto OutputVideoData

echo ERROR: The WMI command-line utility wmic.exe is not installed.
echo(
echo There should not be used anymore batch files with WMIC on this computer.
echo(
echo There could be installed WMIC via Settings ^> Apps ^> Optional features.
echo(
pause
exit /B

:OutputVideoData
for /F "tokens=1* delims==" %%G in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_VideoController GET CurrentHorizontalResolution^,CurrentVerticalResolution^,Name /VALUE 2^>nul') do (
    if "%%G" == "CurrentHorizontalResolution" (
        set "VresH=none"
        set /A VresH=%%H 2>nul
    ) else if "%%G" == "CurrentVerticalResolution" (
        set "VresV=none"
        set /A VresV=%%H 2>nul
    ) else if "%%G" == "Name" (
        for /F delims^=^ eol^= %%I in ("%%H") do (
            set "Vname=%%I"
            setlocal EnableDelayedExpansion
            echo Res.H: !VresH! - Res.V: !VresV! - Graphics: !Vname!
            endlocal
        )
    )
)
endlocal

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic path /?
  • wmic path Win32_VideoController /?
  • wmic path Win32_VideoController get /?

另请阅读:

最后引用的答案解释了 FOR 循环捕获和处理 WMIC 输出的大部分代码,这不容易理解。

FOR /F选项"tokens=2-4 delims== skip=2"

在使用
WMIC/format:value
或更短的
/VALUE
时没有意义,因为没有输出任何由至少三个等号分隔的四个感兴趣的字符串的行。一行上的所有三个数据将由 
WMIC 分别省略选项 /VALUE
 和选项 
/format:value
 输出,但是如果 
CurrentHorizontalResolution
CurrentVerticalResolution
 没有输出任何内容,则很难处理该行缺失值用空格替换。如果 
CurrentHorizontalResolution
CurrentVerticalResolution
 没有值,则该行仅在视频控制器名称处留下大量空格。

set /A VresH=%%H

set /A VresV=%%H
 导致输出错误消息 
Missing operand.
 来处理 
STDERR,该消息通过 2>nul
 重定向到设备 
NUL,以在没有 CurrentHorizontalResolution
 和没有 
CurrentVerticalResolution 的情况下抑制它
 用于视频控制器。在这种情况下,环境变量 
VresH
VresV
 的当前值不会更改,这就是使用字符串值 
none
 初始化它们的原因。


0
投票
我可能会要求 WMI 仅输出显示水平和垂直分辨率的视频卡。

(显然,如果没有显示这两个属性的结果,那么显示其信息似乎没有什么意义)

@Echo Off SetLocal EnableExtensions For /F "Tokens=2,3,* EOL=N Delims=," %%G In (' %SystemRoot%\System32\wbem\WMIC.exe Path Win32_VideoController Where "Not CurrentHorizontalResolution Is Null And Not CurrentVerticalResolution Is Null" Get CurrentHorizontalResolution^, CurrentVerticalResolution^, Name /Format:CSV 2^>NUL') Do For /F "Tokens=*" %%J In ("%%I") Do Echo %%J: %%G x %%H Pause
为了便于阅读,我已将非常长的单行命令拆分为第 4-8 行,它不需要修改即可在批处理文件中工作。但是,如果您愿意,您可以直接在 cmd.exe 中将其用作单行命令,

(用于测试目的)

For /F "Tokens=2,3,* EOL=N Delims=," %G In ('%SystemRoot%\System32\wbem\WMIC.exe Path Win32_VideoController Where "Not CurrentHorizontalResolution Is Null And Not CurrentVerticalResolution Is Null" Get CurrentHorizontalResolution^, CurrentVerticalResolution^, Name /Format:CSV 2^>NUL') Do @For /F "Tokens=*" %J In ("%I") Do @Echo %J: %G x %H
    
© www.soinside.com 2019 - 2024. All rights reserved.