我可以显示基本笔记本电脑的视频图形信息,但如果笔记本电脑有两个视频芯片,则无法成功,例如英特尔和英伟达。如果我在命令提示符窗口中运行命令行:
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
输入变量的值,但没有显示...
有人可以帮助解决这个问题并解释我的错误,特别是如果请求的字段包含多个以空格分隔的项目,如何处理?
可以使用以下批处理文件代码:
@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
初始化它们的原因。
(显然,如果没有显示这两个属性的结果,那么显示其信息似乎没有什么意义)
@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