如何检测是否安装了 Visual C++ Redistributable for Visual Studio 2012?
我用谷歌搜索了一下,没有人问过这个问题,很惊讶!
如何检测是否安装了 Visual C++ Redistributable for Visual Studio 2012?
我用谷歌搜索了一下,没有人问过这个问题,很惊讶!
这取决于您使用的版本。这两个 2012 密钥对我来说效果很好,它们对应的版本可以下载更新 4。请注意,其中一些 reg 位置可能与操作系统有关。我从Windows 10 x64框中收集了此信息。我将继续转储所有这些 redist 版本和我搜索以检测安装的 reg 密钥。:
Microsoft Visual C++ 2005 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1af2a8da7e60d0b429d7e6453b3d0182
Configuration: x64
Version: 6.0.2900.2180
直接下载网址:https ://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.EXE
Microsoft Visual C++ 2005 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\c1c4f01781cc94c4c8fb1542c0981a2a
Configuration: x86
Version: 6.0.2900.2180
直接下载网址:https ://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.EXE
Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161 (SP1)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\67D6ECF5CD5FBA732B8B22BAC8DE1B4D
Configuration: x64
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])
直接下载网址:https ://download.microsoft.com/download/2/d/6/2d61c766-107b-409d-8fba-c39e61ca08e8/vcredist_x64.exe
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 (SP1)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\6E815EB96CCE9A53884E7857C57002F0
Configuration: x86
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])
直接下载网址:https ://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe
Microsoft Visual C++ 2010 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1926E8D15D0BCE53481466615F760A7F
Configuration: x64
Version: 10.0.40219.325
直接下载网址:https ://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe
Microsoft Visual C++ 2010 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1D5E3C0FEDA1E123187686FED06E995A
Configuration: x86
Version: 10.0.40219.325
直接下载网址:https ://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe
Microsoft Visual C++ 2012 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{ca67548a-5ebe-413a-b50c-4b9ceb6d66c6}
Configuration: x64
Version: 11.0.61030.0
Microsoft Visual C++ 2012 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
Configuration: x86
Version: 11.0.61030.0
版本警告:根据用户Wai Ha Lee的调查结果,“...... VC++ 2012 更新 4 ( )附带的二进制文件具有ATL 和 MFC 二进制文件以及其他所有文件的版本,例如 msvcp110.dll 和 msvcr110.dll11.0.61030.0
11.0.60610.1
11.0.51106.1
。 ..”
附加警告——2012 更新 4:每个用户Krptodr
VC++ 2012 更新 4 (x86) 在 GUID 下显示{95716cce-fc71-413f-8ad5-56c2892d4b3a}
VC++ 2012 Update 4 (x64) 在 GUID 下显示{a1909659-0a08-4554-8af1-2175904903a1}
^^ 提供的 GUID 用于安装程序包。但是,这些分支分为各自的拱形类型的另外两个 GUID。有关详细信息,请参阅以下来源如何检查是否安装了 Microsoft Visual C++ 运行时
Microsoft Visual C++ 2013 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{050d4fc8-5d48-4b8f-8972-47c82c46020f}
Configuration: x64
Version: 12.0.30501.0
直接下载网址:https ://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe
Microsoft Visual C++ 2013 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{f65db027-aff3-4070-886a-0d87064aabb1}
Configuration: x86
Version: 12.0.30501.0
直接下载网址:https ://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe
考虑使用 2015-2019 捆绑包作为替代方案
Microsoft Visual C++ 2015 Redistributable (x64) - 14.0.24215
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{d992c12e-cab2-426f-bde3-fb8c53950b0d}
Configuration: x64
Version: 14.0.24215.1
Microsoft Visual C++ 2015 Redistributable (x86) - 14.0.24215
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{e2803110-78b3-4664-a479-3611a381656a}
Configuration: x86
Version: 14.0.24215.1
考虑使用 2015-2019 捆绑包作为替代方案
警告:要么正在使用新的 2017 年注册表约定,要么尚未最终确定。正如我猜测的最上面的键:
[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle]
和
[HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle]
可能会发生变化,或者至少有不同的嵌套 GUID,我将使用列出以 GUID 结尾的键。
Microsoft Visual C++ 2017 Redistributable (x64) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle\Dependents\{427ada59-85e7-4bc8-b8d5-ebf59db60423}]
Configuration: x64
Version: 14.16.27012.6
Microsoft Visual C++ 2017 Redistributable (x86) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.16,bundle\Dependents\{67f67547-9693-4937-aa13-56e296bd40f6}]
Configuration: x86
Version: 14.16.27012.6
警告:Visual C++ 2019 使用了另一个新的注册表约定。Visual C++ 2019 似乎也没有独立的安装程序,只有 Visual C++ 2015 到 2019 的捆绑安装程序。
14.21.27702
Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.21.27702
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.21,bundle\Dependents\{f4220b74-9edd-4ded-bc8b-0342c1e164d8}]
Configuration: x64
Version: 14.21.27702
Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.21.27702
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.21,bundle\Dependents\{49697869-be8e-427d-81a0-c334d1d14950}]
Configuration: x86
Version: 14.21.27702
14.22.27821
Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.22.27821
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.22,bundle\Dependents\{5bfc1380-fd35-4b85-9715-7351535d077e}]
Configuration: x86
Version: 14.22.27821
Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.22.27821
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.22,bundle\Dependents\{6361b579-2795-4886-b2a8-53d5239b6452}]
Configuration: x64
Version: 14.22.27821
变更日志:
2021 年 10 月 26 日——更新以进一步阐明 10 月 21 日的调查结果。
2021 年 10 月 21 日 - 根据 Krptodr 的调查结果,为 VC++2012 Update 4 (x86) 和 (x64) GUID 添加了额外的警告细节。
2019 年 8 月 19 日 -- 添加了 2015-2019 捆绑版本的新版本
2019 年 6 月 13 日 -- 为 2015-2019 捆绑版本添加了一个新部分,14.21.27702
并在 2015 和 2017 部分添加了关于考虑使用新版本的小注释捆绑作为替代。2018 年 12 月 14 日 --根据 Jim Wolff 的调查结果
更新 MSVC2008 以获取 Service Pack 1 的更新
2018 年 11 月 27 日 -- MSVC2017 v. 更新信息9.0.30729.6161
14.16
2018 年 9 月 12 日——根据 Wai Ha Lee 的调查结果为 2012 更新 4 添加了版本警告 2018 年
8 月 24 日——更新了 2017 年版本 14.15.26706,更新的 Visual C++ 依赖项与 VS 2017 15.8.1 打包在一起
2018 年 5 月 16 日——将 14.14.26405.0 的 2017 版本更新为新的 C++ 2017 条目
2017 年 9 月 8 日 - 将 14.11.25325.0 的 2017 版本更新为新的 Visual C++ 2017 条目
2017 年 4 月 7 日 - 将 2017 的版本 14.10.25008.0 更新为新的 Visual C++ 2017 条目
2016 年 10 月 24 日 -- 更新 2015 年版本信息 14.0.24215.1
2016 年 8 月 18 日 -- 更新 2015 年版本信息 14.0.24212
2016 年 5 月 27 日 -- 更新 MSVC2015 更新 2 信息
如果其中任何一个变得过时,请在此处与我联系。
尝试
HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
作为起点。我将使用它作为安装 VC++ 11 (VS 2012) 运行时的检查。
您可以检查此注册表位置中的Installed
值:在 64 位系统上。在会导致访问注册表项的代码中。注意没有。1
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
Wow6432Node
在 32 位系统上,注册表是相同的,但没有Wow6432Node
:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
Visual C++ 附带的引导程序包清单中没有 installcheck 元素。如果您将其设置为先决条件,猜猜微软希望始终安装。
当然你仍然可以调用 MsiQueryProductState 来检查是否通过 MSI 安装了 VC redist 包,可以通过运行找到包代码
wmic product get
在命令行,或者如果你已经在 wmic:root\cli,运行
product where "Caption like '%C++ 2012%'"
不幸的是,这个简单问题的答案并不简单,而是在 100% 的所有系统中工作,甚至可以扩展到众多 .net 框架。
复杂性来自这样一个事实,即存在(并且曾经)许多 VC 运行时修订,这可能导致尽管安装了 VC10 运行时,但它们的内部版本号不够新,因此除非您安装了非常您需要的确切运行时或较新的运行时之一,它使同一主要版本的此版本和以前的版本能够与它一起运行(并排地狱)。此外,如果您有 64 位 EXE,则必须同时检查 32 位和 64 位运行时。
也就是说,确定您的 EXE 的运行时是否已安装的唯一可靠方法是尝试运行该 EXE - 或另一个与您的主 EXE 具有相同设置且其唯一目的是不执行任何操作的 EXE。只是运行(这意味着运行时已安装)或运行失败(未安装时)。
我为需要安装 VC10 32 位和 64 位运行时的安装程序执行了以下操作:安装程序尝试启动所有虚拟 EXE,如果成功,则认为已安装相应的运行时。这也解决了 32/64 位方案。
顺便说一句,这也可以确定是否安装了正确的 .net 框架,这在 Windows 8 和 10 中非常棘手,因为可下载的内置 .net 3.5 支持也支持 .net 版本 3.0 和 2.0 - 那里没有这些的注册表项。(更糟糕的是,您甚至不能在这里使用标准框架安装程序,您必须使用内置支持并通过 Windows 下载它,或者使用 .net 4 重新构建您的应用程序,但那是另一回事了)。
可以使用具有以下代码的项目构建 C++ 虚拟 EXE(如果需要,还可以使用 64 位配置的另一个项目):
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
请记住将项目的属性Use of MFC设置为Use MFC in a shared DLL。可执行文件的大小约为 4KB - 为获得确定的结果付出了很小的代价。
为了给您的用户提供良好的安装体验,您可以执行以下操作(示例代码适用于NSIS):
Function TryLaunchApplication
Pop $1 ; pathname
nsExec::Exec $1
Pop $0
${If} $0 == "error"
${OrIf} $0 != 0
Push 0
${Else}
Push 1
${EndIf}
FunctionEnd
并在函数中调用它,例如CheckRuntimes
Function CheckRuntimes
; Try to execute VC++ 10 application (32 bit)
Push "Vc10RuntimeCheckerApp.exe"
Call TryLaunchApplication
Pop $Vc10RuntimesFound
; Add 64 bit check if required.
; Remember to try running the 64 bit EXE only on a 64 bit OS,
; which requires further checks.
; Try to execute .net application
Push "DotNetRuntimeCheckerApp.exe"
Call TryLaunchApplication
Pop $DotNetFrameworkFound
FunctionEnd
然后启动运行时检查,例如在离开欢迎页面并缓存结果时,这样您就不必在每次用户单击“返回”和“下一步”按钮时重新检查。
接下来,在安装树中创建一个只读部分,并在显示组件页面之前执行的功能上预先选择或取消选择它。
这将确保每个缺少的运行时组件的安装都是强制性的,如果它已经存在则跳过它。
由于 Visual Studio 2010 及更高版本停止使用 WinSxS,因此只需检查 %windir%\system32\msvcr110.dll 就足够了。如果要验证是否有足够新的版本,可以检查文件版本是 11.0.50727.1 (VS2012 RTM) 还是 11.0.51106.1 (VS2012 Update 1)。
我遇到了这个问题,在检查作为由 WiX 创建的 MSI 安装程序的一部分的 Visual C++ 可再发行组件的上下文中寻找答案。
我不喜欢 GUID 随版本和操作系统的变化,所以我最终创建了一个用 C# 编写的自定义操作来检查 Visual C++ 可再发行组件。
以下所有内容都专门针对 Visual C++ 2015 Redistributable (x64),但可以轻松修改为任何版本。
using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Win32;
namespace CustomActions
{
public class DependencyChecks
{
[CustomAction]
public static ActionResult IsVC2015RedistInstalled(Session session)
{
session.Log("Begin Visual C++ 2015 Redistributable installation check.");
var dependenciesKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Classes\\Installer\\Dependencies");
foreach(var subKey in dependenciesKey.GetSubKeyNames())
{
var dependency = dependenciesKey.OpenSubKey(subKey);
var displayName = (string)dependency.GetValue("DisplayName");
if(displayName != null)
{
if (displayName.Contains("Microsoft Visual C++ 2015 Redistributable (x64)"))
{
session.Log("Visual C++ 2015 Redistributable is installed.");
return ActionResult.Success;
}
}
}
session.Log("Visual C++ 2015 Redistributable is not installed.");
session.Message(InstallMessage.Error, new Record(1, "This application requires Visual C++ 2015 Redistributable. Please install, then run this installer again. https://www.microsoft.com/en-us/download/details.aspx?id=53587"));
return ActionResult.Failure;
}
}
}
然后在wxs文件中
<Binary Id='VC2015RedistCheck' SourceFile='!(wix.ResourcesDir=resources)\CustomActions.CA.dll'/>
<CustomAction
Id='VC2015RedistCheckAction'
Execute='immediate'
BinaryKey='VC2015RedistCheck'
DllEntry="IsVC2015RedistInstalled"
Return='check'/>
<InstallExecuteSequence>
<Custom Action='VC2015RedistCheckAction' After='InstallInitialize'/>
</InstallExecuteSequence>
编辑 我正在使用有关创建和使用自定义操作的一些基本信息来更新此答案。
为了在安装了 WiX Toolset Visual Studio 2017 扩展的 Visual Studio 2017 中创建自定义操作,我使用项目模板来创建自定义操作(C# Custom Action Project for WiX v3)。
我检查了生成的项目,它似乎已经在本文开头列出了更改:https ://www.codeproject.com/Articles/132918/Creating-Custom-Action-for-WIX-Written-in-Managed所以我在该部分选择了那篇文章,Adding Custom Action to the Installer
并对其进行了一些调整。
我做的另一件事是将构建项目的 .NET 框架的版本更改为 3.5。
我没有发现它真的很有用,但您也可以查看http://wixtoolset.org/documentation/manual/v3/wixdev/extensions/authoring_custom_actions.html
对我来说,这个位置有效:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevDiv\vc\Servicing\11.0\RuntimeMinimum\Version
安装软件包后检查您拥有的版本,并将其用作安装程序中的条件。(安装 VCred 后我的设置为 11.0.50727)。
只需转到控制面板>程序和功能,它们都会出现在那里。
我不是专家,与人们回答的内容(检查注册表)相比,这个答案非常简单,所以我不确定它是否是正确的答案,但它对我有用。
if RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86","Installed") = 0 Then
if RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86","Installed") = 0 Then
我已经用 InnoSetup 成功地做到了这一点。
我检查了注册表项的存在:
HKLM\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes
如果卸载,则不存在。如果已安装,则存在。
顺便说一句,它也可能在 Wow6432Node 中:
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes
这个 PowerShell 代码应该可以解决问题
Get-ItemProperty
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table –AutoSize
通过MsiQueryProductState检查产品的安装状态几乎等同于直接检查注册表,但您仍然需要ProductCode的 GUID 。
如其他地方所述,这些方法的一个缺点是每次更新都有自己的 ProductCode!
值得庆幸的是,MSI 提供了一个UpgradeCode来标识一个“系列”产品。您可以使用 orca 打开其中一个 MSI 以提取此信息。例如,VS2015 的可再发行组件的 UpgradeCode 是{65E5BD06-6392-3027-8C26-853107D3CF1A}
您可以使用MsiEnumRelatedProducts获取该 UpgradeCode 的所有产品 ID。在实践中,由于每个 redist 更新都会替换前一个,因此只会产生一个 ProductCode - 例如{B5FC62F5-A367-37A5-9FD2-A6E137C0096F}
VS2015 Update 2 x86。
无论如何,您可以通过MsiGetProductInfo (productCode, INSTALLPROPERTY_VERSIONSTRING, ...) 或类似功能检查版本,以与您想要的版本进行比较,例如检查等效或更高版本。
请注意,在 C++ 应用程序中,您还可以使用_VC_CRT_MAJOR_VERSION
, _VC_CRT_MINOR_VERSION
,_VC_CRT_BUILD_VERSION
如果您#include <crtversion.h>
-- 这样您可以确定计算构建二进制文件的 CRT 版本。
我需要同样的东西,虽然 AFAIK 这不能以编程方式完成,但它对我有用。
我只是去开始 --> 卸载程序,然后向下滚动,直到找到 VC++ 可再发行组件,其中包括一个版本号。谷歌搜索版本号,告诉我它属于 VS2012 SP1。
老问题,但这是我们自 Visual Studio 2005 以来成功使用的方法。我刚刚也使用 Visual Studio 2012 Update 4 对其进行了测试(因为我们最终将软件从 2010 年更新到 2012 年)。
由于 Visual C++ Redistributable 包在 windows 中注册了它们的卸载程序(因此它显示在控制面板的“程序和功能”列表中),我们只需检查注册表中卸载程序键的显示名称。
以下是相关的 NSIS 代码:
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}\" "DisplayName"
StrCmp $0 "Microsoft Visual C++ 2012 Redistributable (x86) - 11.0.61030" vs2012redistInstalled
DetailPrint "Microsoft Visual C++ 2012 Update 4 Redistributable not found!"
DetailPrint "Downloading from www.mywebsite.com"
; insert applicable download code here
ExecWait '"<downloaded redist exe>" /promptrestart /passive'
vs2012redistInstalled:
请注意,由于我们的安装程序是 32 位 exe,Windows 会处理确定注册表项是否实际上位于虚拟化的 Wow6432Node 而不是上述位置,因此上述代码适用于 64 位和 32 位 Windows 安装,而无需显式检查这两个键。
另请注意,要将上述代码更新为不同版本的 VC++ Redist,只需将注册表项路径中的 GUID 和显示名称更改为您需要的任何内容。
虽然这可能不是推荐的方法,但在过去 10 年中,它已经在 10,000 多台机器上运行,运行从 XP/XP64 到 Windows 10 的各种 Windows 版本,使用 2005、2010、2010sp1 和现在的 2012u4 的 redist。
我会检查的Installed
值
HKLM\SOFTWARE\[WOW6432Node]\Microsoft\Windows\CurrentVersion\Uninstall\{VCRedist_GUID}
钥匙
VC++ 2012 (x86)
是{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
WOW6432Node
是否存在取决于VC++ redist
产品大多数人错过的是/reg:32
在 Windows x64 上检查密钥的要求。
请参阅有关此主题的Microsoft 帮助文章。
这是一个演示如何正确检查 Visual C++ Redistributable for Visual Studio 2012 Update 4 的脚本。
@ECHO OFF
:Author
REM "CREATED BY WAR59312"
REM "FEB 7th 2017"
REM Clear Screen
CLS
TITLE Detect Visual C++ 2012 Redistributables
REM This Batch Script Detects If Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
:DetectWindowsOS
REM Are We Running On x86 Or x64
IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
IF %PROCESSOR_ARCHITECTURE% EQU x86 (
REM Windows Is x86
GoTo Check32Bit
) ELSE (
REM Windows Is x64
SET NeededFor64BitOnly=/reg:32
GoTo Check64Bit
)) ELSE (
REM Windows Is Unknown But Assume x64 To Be Safe
SET NeededFor64BitOnly=/reg:32
GoTo Check64Bit
)
:Check64Bit
REM Checks If Visual C++ 64Bit Redistributable for Visual Studio 2012 Update 4 Is Installed
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x64" /v "Version" %NeededFor64BitOnly% 2>NUL^ | (
FIND "v11.0.61030.00" >NUL
) && (
ECHO.
ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
ECHO.
GoTo Check32Bit
) || (
ECHO.
ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed
ECHO.
GoTo Check32Bit
)
:Check32Bit
REM Checks If Visual C++ 32Bit Redistributable for Visual Studio 2012 Update 4 Is Installed
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86" /v "Version" %NeededFor64BitOnly% 2>NUL^ | (
FIND "v11.0.61030.00" >NUL
) && (
ECHO.
ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
) || (
ECHO.
ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed
)
:END
ECHO.
PAUSE
EXIT
我在 Server 2019 和 Windows 10 中为 PowerShell 使用了这一衬里。我不知道这是多么向后兼容。
Get-CimInstance -Class Win32_Product -Filter "Name LIKE '%Visual C++ %Redistri%'" | Select Name, Caption, Version
很难获得 VC 2012 的所有注册表值,所以我编写了一个小函数,它将遍历所有依赖项并匹配指定版本。
public static bool IsVC2012Installed()
{
string dependenciesPath = @"SOFTWARE\Classes\Installer\Dependencies";
using (RegistryKey dependencies = Registry.LocalMachine.OpenSubKey(dependenciesPath))
{
if (dependencies == null) return false;
foreach (string subKeyName in dependencies.GetSubKeyNames().Where(n => !n.ToLower().Contains("dotnet") && !n.ToLower().Contains("microsoft")))
{
using (RegistryKey subDir = Registry.LocalMachine.OpenSubKey(dependenciesPath + "\\" + subKeyName))
{
var value = subDir.GetValue("DisplayName")?.ToString() ?? null;
if (string.IsNullOrEmpty(value)) continue;
if (Regex.IsMatch(value, @"C\+\+ 2012")) //here u can specify your version.
{
return true;
}
}
}
}
return false;
}
依赖项:
using System.Text.RegularExpressions;
using Microsoft.Win32;
using System.Linq;
powershell脚本解决方案:
根据@kayleeFrye_onDeck 的回答中的信息
我创建了一个 powershell 脚本来检查和安装用户指定的版本,我没有对它进行过广泛的测试,但是对于我自己的 CI(持续集成)场景,它可以完美地工作。
github上的完整脚本和信息
我使用的方法是根据此处提供的信息检查 regkeys。以下是脚本所做的要点:
function Test-RegistryValue {
param (
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]$Path,
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]$Value
)
try {
Get-ItemProperty -Path "$($Path+$Value)" -ErrorAction Stop | Out-Null
return $true
}
catch {
return $false
}
}
基于它的检查/下载/静默安装$redistInfo
包含来自kayleeFrye_onDeck的编译信息。
$redistInstalled = Test-RegistryValue -Path $redistInfo.RegPath -Value $redistInfo.RegValue
if($redistInstalled -eq $False) {
Invoke-WebRequest -Uri $redistInfo.DownloadUrl -OutFile $downloadTargetPath
Start-Process -FilePath $downloadTargetPath -ArgumentList "$($redistInfo.SilentInstallArgs)" -Wait -NoNewWindow | Wait-Process
}
完整的脚本和更多信息可以在github上找到
欢迎任何人贡献,如果我有时间,我将对脚本进行更广泛的测试,并在此处添加信息时继续尝试添加新包。
你可以在注册表中搜索。实际上我没有vs2012,但我有vs2010。
3 个平台包中的每一个都有 3 个不同(但非常相似)的注册表项。每个键都有一个名为“Installed”的 DWORD 值,值为 1。
HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86
HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64
HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\ia64
您可以使用注册表功能......