根据注册表项的存在在批处理文件中安装软件

Posted

技术标签:

【中文标题】根据注册表项的存在在批处理文件中安装软件【英文标题】:Installing Software in a batch file based on the prescence of a Registry Key 【发布时间】:2021-03-29 03:38:42 【问题描述】:

我正在尝试通过批处理文件安装某些软件的最新版本。 每个版本都有一个唯一的字符串值,所以我只想在注册表中的值不是最新版本的情况下安装最新版本。

以下是我的批处理文件的一部分:

reg query HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall731F6BAA-A986-45A4-8936-7C3AAAAA760B /f 1.3.0.13565 if %ErrorLevel% EQU 0 goto INSTALL if %ErrorLevel% EQU 1 goto END

问题是这不起作用。字符串名称是 DisplayVersion 但如果我输入 if %DisplayVersion% EQU 1.3.0.13565 这也不起作用。也许我不应该使用ErrorLevel?可以说if DisplayVersion equals to 1.3.0.13565 then GOTO INSTALL else END吗?

编辑:

我的批处理文件现在看起来像这样:

@%SystemRoot%\System32\reg.exe Query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\731F6BAA-A986-45A4-8936-7C3AAAAA760B" /F "1.3.0.13565" /Reg:32 1> NUL 2>&1 || Exit /B

:INSTALL
msiexec /x 731F6BAA-A986-45A4-8936-7C3AAAAA760B /q
msiexec /i "\\appserve01\share$\Teams\Teams_x64_13028779.msi" ALLUSER=1

:END

【问题讨论】:

【参考方案1】:

以下行应该足以执行您所要求的所有问题。

%SystemRoot%\System32\reg.exe Query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\731F6BAA-A986-45A4-8936-7C3AAAAA760B" /F "1.3.0.13565" /Reg:32 1> NUL 2>&1 && (GoTo INSTALL) || GoTo END

我认为没有必要让它变得更健壮,除非您真的认为字符串 1.3.0.13565 可能存在于该键下的值或数据的其他位置。

【讨论】:

您好,抱歉回复延迟,我刚刚注意到您的回复。非常感谢您回到我身边并提供代码。不幸的是,当我在批处理文件中运行上述代码行时,什么也没有发生。此外,我不完全确定以下内容是什么意思:/Reg:32 1> NUL 2>&1 &&。如果该密钥存在,我最终需要将批处理文件转到 GoTo Install,如果不存在则需要 END。再次感谢您。 我发布的命令与我发布的完全一样,没有任何添加、删除或修改。如果您没有在未修改的情况下运行它,我需要查看您修改的确切内容以进一步帮助您。 感谢您的快速回复。批处理文件中有以下内容:%SystemRoot%\System32\reg.exe Query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\731F6BAA-A986-45A4-8936-7C3AAAAA760B" /F "1.3.0.13565" /Reg:32 1> NUL 2>&1 && (转到安装) || GoTo END :INSTALL rem 第 1 步:卸载 Microsoft Teams 1.3.0.13565 msiexec /x 731F6BAA-A986-45A4-8936-7C3AAAAA760B /q rem 第 2 步:安装 Microsoft Teams 1.3.0.28779 msiexec /i "\\appserver01\applications$ \Teams\Teams_x64_13028779.msi" ALLUSER=1 :END 我上面的命令行是你的批处理文件的一部分,但我从未见过它,所以只能根据我所知道的来回答。目前我唯一知道的是,我在上面提供的命令将单独执行您想要的操作。但是,批处理文件的其余部分是否正确写入并保存以合并它是另一回事。请使用edit 按钮更新您的问题,包括该信息和一些调试信息。顺便说一句,不要在评论区发布格式化代码,它将是,而且是不可读的! 如果您将批处理文件的第一行设为:@%SystemRoot%\System32\reg.exe Query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\731F6BAA-A986-45A4-8936-7C3AAAAA760B" /F "1.3.0.13565" /Reg:32 1> NUL 2>&1 || Exit /B,那么您只需将卸载和安装代码放在该行下方即可。只有当字符串1.3.0.13565 在 64 位 Windows 机器上的 32 位注册表中找到,或者在仅 32 位 Windows 版本上的正常注册表位置中找到时,它才会运行。当然,所有这些都可能取决于您将此脚本针对的 Windows 版本。

以上是关于根据注册表项的存在在批处理文件中安装软件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Inno Setup 根据注册表项选择在文件夹中安装插件/文件?

批处理如何设置注册表项的权限

如何在 Service Fabric 中安装批处理文件

linux中安装软件时提示已存在,删除时又提示不存在

使用 Lambda 在 AWS Codestar 中安装 Python 依赖项

求大神帮忙解决关于CentOS系统中安装软件提示缺少文件的问题