Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file NSIS—监控器从CMD命令到变量的刷新率_Batch File_Cmd_Windows Installer_Nsis_Resolution - Fatal编程技术网

Batch file NSIS—监控器从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%\

通过在CMD中键入以下命令,我可以获得主监视器的刷新率:

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视频控制器获取/?
阅读有关的Microsoft文档,以了解有关nul的说明。当Windows命令解释器在执行的命令之前处理该命令行时,重定向操作符必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的wmic命令行命令进程在后台启动,并将
%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