Batch file NSIS—监控器从CMD命令到变量的刷新率
通过在CMD中键入以下命令,我可以获得主监视器的刷新率:Batch file NSIS—监控器从CMD命令到变量的刷新率,batch-file,cmd,windows-installer,nsis,resolution,Batch File,Cmd,Windows Installer,Nsis,Resolution,通过在CMD中键入以下命令,我可以获得主监视器的刷新率: wmic路径Win32\u视频控制器获取当前刷新率 结果: CurrentRefreshRate 144 75 第二行是我的主监视器的刷新率。我希望将此编号分配给名为$refreshrate的变量。如何实现这一点?这可以通过以下批处理文件代码实现: @set "RefreshRate=" & for /F "tokens=2 delims==" %%I in ('%SystemRoot%\
wmic路径Win32\u视频控制器获取当前刷新率
结果:
CurrentRefreshRate
144
75
第二行是我的主监视器的刷新率。我希望将此编号分配给名为
$refreshrate
的变量。如何实现这一点?这可以通过以下批处理文件代码实现:
@set "RefreshRate=" & for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_VideoController GET CurrentRefreshRate /VALUE 2^>nul') do @if not defined RefreshRate set "RefreshRate=%%I"
更容易阅读的是:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_VideoController GET CurrentRefreshRate /VALUE 2^>nul') do set "RefreshRate=%%I" & goto HaveRate
echo Failed to determine the refresh rate of primary monitor.
goto EndBatch
:HaveRate
echo Refresh rate of primary monitor is: %RefreshRate%
:EndBatch
endlocal
pause
要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
echo/?
endlocal/?
获取/?
goto/?
暂停/?
设置/?
setlocal/?
wmic/?
wmic路径/?
wmic路径Win32\u视频控制器/?
wmic路径Win32\u视频控制器获取/?
%ComSpec%/c
和'
中的命令行作为附加参数附加
请注意,WMIC输出始终采用带字节顺序标记(BOM)的UTF-16 Little Endian进行Unicode编码,在处理此输出时必须考虑到这一点
我对NSIS一无所知,因此不知道如何从NSIS脚本中运行Windows命令并将其输出分配给NSIS变量
可以使用以下命令行运行cmd.exe
,该命令以第一(主)监视器的刷新率退出
如果命令行无法确定刷新率,
cmd.exe
的退出代码为0。否则,cmd.exe返回的退出代码是第一个(主)监视器的刷新率值。这可以通过以下批处理文件代码完成:
@set "RefreshRate=" & for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_VideoController GET CurrentRefreshRate /VALUE 2^>nul') do @if not defined RefreshRate set "RefreshRate=%%I"
更容易阅读的是:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_VideoController GET CurrentRefreshRate /VALUE 2^>nul') do set "RefreshRate=%%I" & goto HaveRate
echo Failed to determine the refresh rate of primary monitor.
goto EndBatch
:HaveRate
echo Refresh rate of primary monitor is: %RefreshRate%
:EndBatch
endlocal
pause
要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
echo/?
endlocal/?
获取/?
goto/?
暂停/?
设置/?
setlocal/?
wmic/?
wmic路径/?
wmic路径Win32\u视频控制器/?
wmic路径Win32\u视频控制器获取/?
阅读有关的Microsoft文档,以了解有关nul的说明。当Windows命令解释器在执行的命令之前处理该命令行时,重定向操作符
必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的wmic命令行命令进程在后台启动,并将%ComSpec%/c
和'
中的命令行作为附加参数附加
请注意,WMIC输出始终采用带字节顺序标记(BOM)的UTF-16 Little Endian进行Unicode编码,在处理此输出时必须考虑到这一点
我对NSIS一无所知,因此不知道如何从NSIS脚本中运行Windows命令并将其输出分配给NSIS变量
可以使用以下命令行运行cmd.exe
,该命令以第一(主)监视器的刷新率退出
如果命令行无法确定刷新率,
cmd.exe
的退出代码为0。否则,cmd.exe返回的退出代码是第一(主)监视器的刷新率值。您不必依赖外部工具,您可以直接询问系统:
对于整个屏幕:
!include LogicLib.nsh
Section
!define /IfNDef VREFRESH 116
System::Call USER32::GetDC(p0)p.r0
System::Call GDI32::GetDeviceCaps(pr0,i${VREFRESH})i.r1
System::Call USER32::ReleaseDC(p0,pr0)
${If} $1 < 5
StrCpy $1 "Invalid"
${EndIf}
DetailPrint "Refresh rate=$1"
SectionEnd
您不必依赖外部工具,您可以直接询问系统:
对于整个屏幕:
!include LogicLib.nsh
Section
!define /IfNDef VREFRESH 116
System::Call USER32::GetDC(p0)p.r0
System::Call GDI32::GetDeviceCaps(pr0,i${VREFRESH})i.r1
System::Call USER32::ReleaseDC(p0,pr0)
${If} $1 < 5
StrCpy $1 "Invalid"
${EndIf}
DetailPrint "Refresh rate=$1"
SectionEnd
我的第一个想法是创建一个隐藏在NSIS安装程序中的BAT文件,它创建一个带有结果的txt文件,并使用NSIS读取该txt文件。但这可能是一种丑陋的方式。您可能可以使用系统插件来实现。我的第一个想法是创建一个隐藏在NSIS安装程序中的BAT文件,它创建一个带有结果的txt文件,然后使用NSIS读取该txt文件。但这可能是一种丑陋的方式,你可以用系统插件来实现。
!include "StrFunc.nsh"
${Using:StrFunc} StrRep
!include LogicLib.nsh
Section
nsExec::ExecToStack '"wmic.exe" PATH Win32_videocontroller get currentrefreshrate /all'
Pop $0
Pop $1
${StrRep} $1 $1 "currentrefreshrate" ""
loop:
StrCpy $2 $1 1
${If} $2 == "$\r"
${OrIf} $2 == "$\n"
${OrIf} $2 == " "
StrCpy $1 $1 "" 1
Goto loop
${EndIf}
IntOp $2 $1 + 0 ; First number
${If} $0 = 0
DetailPrint WMIC=$2
${EndIf}
SectionEnd