将reg查询输出放入变量

时间:2019-05-03 08:35:49

标签: .net windows batch-file cmd registry

我对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

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

2 个答案:

答案 0 :(得分:0)

我建议您使用errorlevel确定字符串是否成功返回。

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5"
if errorlevel 1 install framework

发生的情况是find返回1的错误级别(没有匹配项),找到了0个匹配项。这样,您无需设置变量。

以上内容可以扩展为多个命令:

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5"
if errorlevel 1 (
    echo Framework not found
    install framework
    echo do something else
)

对于for循环问题,正如@LotPings在评论中已经提到的那样,您需要对管道^|进行转义:

for /f "delims=" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" ^| Find "3.5" 2^>nul) do set "var=%%i"
echo %var%

答案 1 :(得分:0)

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

@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

发布新版本时,您只需使用相关信息更新底部的内容,以使检测结果保持最新。