首页 > 解决方案 > 将 reg 查询输出放入变量中

问题描述

我对 CMD 有点陌生,希望这里有人可以帮助我。

在我的一个旧安装脚本中,我现在需要检查是否安装了 .NET 3.5,然后根据结果安装 3.5 包或继续使用脚本。

现在我在尝试检查脚本中安装的版本时遇到了一些麻烦。

我使用此 reg 查询来查找已安装的版本:

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5"

如果安装了 3.5,则输出单行,如果没有,则不输出:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5

现在我的想法是,创建一个变量并用上面看到的输出填充值。

不幸的是,像:

set DNFound=reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5"
if not exist %DNFound%
(
 install framework
)

不起作用,因为输出不会保存在变量中。

我进行了一些研究,看到人们以这种格式进行循环,以从 reg 查询输出中获取单个值到变量中(示例代码):

 for /f "tokens=3" %%x in ('reg query HKLM\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile /v EnableFirewall') do set FWSTATUS=%%x

| Find "3.5" 但是,由于我的 reg 查询中的一部分,当我尝试执行相同操作时出现语法错误。

标签: .netwindowsbatch-filecmdregistry

解决方案


作为对您问题的补充,因为它可能与未来的用户相关,您应该能够使用类似于以下的方法输出所有已安装的版本:

@Echo Off
SetLocal EnableDelayedExpansion
Set "rk=HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP"
Set/A "vi=ri=0"

For /F "Tokens=3*" %%A In ('Reg Query "%rk%" /F v /K') Do If "%%B"=="" (
    If Not "%%~xA"=="" (Set/A "vi+=1"
        For /F "Tokens=2*" %%C In (
            'Reg Query "%rk%\%%~nxA" /V Version 2^>Nul^|Find /V "\"'
        ) Do Set "_v!vi!=%%D"
    ) Else (Set/A "ri+=1"
        For /F "Tokens=2*" %%E In (
            'Reg Query "%rk%\%%~nxA\Full" /V Release 2^>Nul^|Find /V "\"'
        ) Do Set/A "_r!ri!=%%F"))
If %ri% Gtr 0 (Set/A "vi+=1"
    For /F "Tokens=2" %%A In ('FindStr/B "!_r%ri%!" "%~f0"'
    ) Do Set "_v%vi%=%%A")

If %vi% Gtr 0 For /F "Tokens=1* Delims==" %%A In ('Set _v') Do Echo([%%B]

Pause
GoTo :EOF

Rem Later Version Table - do not remove
378389 4.5
378675 4.5.1
378758 4.5.1
379893 4.5.2
393295 4.6
393297 4.6
394254 4.6.1
394271 4.6.1
394802 4.6.2
394806 4.6.2
460798 4.7
460805 4.7
461308 4.7.1
461310 4.7.1
461808 4.7.2
461814 4.7.2
528040 4.8
528049 4.8

当新版本出来时,您只需使用相关信息更新底部的内容,这样检测将保持最新。


推荐阅读