.net 将reg查询输出放入变量

.net 将reg查询输出放入变量,.net,windows,batch-file,cmd,registry,.net,Windows,Batch File,Cmd,Registry,我对CMD有点经验不足,希望这里有人能帮助我 在我的一个旧安装脚本中,我现在需要检查是否安装了.NET3.5,然后根据结果安装3.5包或继续使用脚本 现在,我在检查脚本中安装的版本时遇到了一些问题 我使用此注册表查询查找已安装的版本: reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5" 如果安装了3.5,则输出一条线路;如果未安装,则不输出任何线路: HKEY_LOCAL_

我对CMD有点经验不足,希望这里有人能帮助我

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

现在,我在检查脚本中安装的版本时遇到了一些问题

我使用此注册表查询查找已安装的版本:

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查询输出中获取单个值,并将其转换为变量(示例代码):


但是,当我尝试执行相同操作时,会出现语法错误,因为我的reg查询中有
| Find“3.5”
部分。

我建议您使用
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循环问题,正如在注释中所提到的,您需要转义管道
^ |

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%

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

@Echo关闭
SetLocal EnableDelayedExpansion
设置“rk=HKLM\SOFTWARE\Microsoft\NET Framework安装程序\NDP”
设置/A“vi=ri=0”
对于('Reg查询“%rk%”/F v/K)中的/F“令牌=3*”%%A,如果“%%B”==”,则执行该操作(
如果不是“%~xA”==”(设置/A“vi+=1”
对于/F“令牌=2*”%%C In(
'注册查询“%rk%\%%~nxA”/V版本2^>Nul^^查找/V“\”'
)设置“_v!vi!=%%D”
)其他(设置/A“ri+=1”
对于/F“令牌=2*”%%E In(
'注册查询“%rk%\%%~nxA\Full”/V第2版^>Nul^查找/V“\”
)设置/A“\u r!ri!=%F”))
如果%ri%Gtr 0(设置/A“vi+=1”
对于('FindStr/B“!\u r%ri%!”“%f0”中的/F“令牌=2”%%A
)设置“\u v%vi%=%A”)
如果%vi%Gtr 0用于/F“令牌=1*Delims==”('Set _v')中的%%A做回显([%%B]
暂停
后藤:EOF
Rem更新版本表-不删除
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

新版本发布后,您只需使用相关信息更新底部的内容,这样检测将保持最新状态。

因为涉及第二个cmd.exe实例,您需要使用插入符号转义管道符号。您还应该将错误流重定向到nul
2^>nul
。感谢您的帮助提示,我跳过了管道符号并使命令正常工作。在执行此操作时,我发现我的思维过程是错误的,我没有在这里检查变量是否存在,但变量的内容是否存在。因此,无论如何,我将不得不走另一条路。我只是想补充一点,您的问题似乎有点奇怪,因为v3.5是与
Windows 7
中的操作系统集成,这意味着您只需检查操作系统是否至少使用了10年(XP到Vista/Server 2008 R2)。几乎我们所有的W10工作站都只安装了.NET 4.0及以上版本。Windows 7中的每一个Windows版本(这意味着您的每一个Windows 10工作站),已经安装了最低版本的
3.5
。您的任务与此无关,因为绝对不需要在其中任何一个上安装它。命令
set DNFound=reg query“HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP”| Find“3.5”
不设置
DNFound
并始终返回errorlevel 1,因为从未执行命令reg查询(这不是bash或powershell),因为LotPings已经说过在此处设置变量不会得到我想要的结果。但是我不再需要该变量,只需删除“set DNFound=”给我我需要的结果。非常感谢你们。如果我知道如何给你们一些+Rep,我会很乐意这样做。@LotPings..是的,谢谢注意,我忘了删除
集合
部分..直接复制/粘贴失败
:)
我修复了它。@NickHH45是的,我复制了包括集合在内的命令,这是我这边的一个错误。。我现在修好了。我们不需要集合,我们只需要
find
的结果
errorlevel1
2
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%