Определить, установлен ли распространяемый Visual C++ для Visual Studio 2012
Как определить, установлен ли распространяемый Visual C++ для Visual Studio 2012?
Я попробовал Google это, и никто не задавал этот вопрос, удивление!
21 ответ
Это зависит от того, какую версию вы используете. Эти два ключа 2012 года хорошо сработали для меня с их соответствующими версиями для загрузки для Обновления 4. Помните, что некоторые из этих местоположений рег могут зависеть от ОС. Я собрал эту информацию из Windows 10 x64 box. Я просто собираюсь пойти дальше и сбросить все эти повторные версии и ключи reg, которые я ищу, чтобы обнаружить установку.
Visual C++ 2005
Microsoft Visual C++ 2005 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1af2a8da7e60d0b429d7e6453b3d0182
Configuration: x64
Version: 6.0.2900.2180
URL-адрес для прямой загрузки: 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
URL для прямой загрузки: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.EXE
Visual C++ 2008
Microsoft Visual C++ 2008 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\67D6ECF5CD5FBA732B8B22BAC8DE1B4D
Configuration: x64
Version: 9.0.30729.5677
URL-адрес для прямой загрузки: https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe
Microsoft Visual C++ 2008 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\6E815EB96CCE9A53884E7857C57002F0
Configuration: x86
Version: 9.0.30729.5677
URL-адрес для прямой загрузки: https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe
Visual C++ 2010
Microsoft Visual C++ 2010 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1926E8D15D0BCE53481466615F760A7F
Configuration: x64
Version: 10.0.40219.325
URL-адрес для прямой загрузки: 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
URL-адрес для прямой загрузки: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe
Visual C++ 2012
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
URL-адрес для прямой загрузки: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe
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
URL-адрес для прямой загрузки: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe
предостережение версии: По Wai Ha Lee пользователя Wai Ha Lee, "... двоичные файлы, поставляемые с VC++ 2012, обновление 4 ( 11.0.61030.0
) есть версия 11.0.60610.1
для двоичных файлов ATL и MFC, и 11.0.51106.1
для всего остального, например, msvcp110.dll и msvcr110.dll... "
Visual C++ 2013
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
URL-адрес для прямой загрузки: 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
URL-адрес для прямой загрузки: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe
Visual C++ 2015
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
URL-адрес для прямой загрузки: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe
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
URL-адрес для прямой загрузки: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe
Visual C++ 2017
Предостережение: либо используется новое соглашение о реестре 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
URL-адрес для прямой загрузки: https://download.visualstudio.microsoft.com/download/pr/9fbed7c7-7012-4cc0-a0a3-a541f51981b5/e7eec15278b4473e26d7e32cef53a34c/vc_redist.x64.exe
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
URL-адрес для прямой загрузки: https://download.visualstudio.microsoft.com/download/pr/d0b808a8-aa78-4250-8e54-49b8c23f7328/9c5e6532055786367ee61aafb3313c95/vc_redist.x86.exe
Журнал изменений:
27 ноября 2018 года - Обновлена информация для MSVC2017 v. 14.16
12 сентября 2018 года - добавлена версия предостережения для обновления 4 за 2012 год согласно выводам Вай Ха Ли
24 августа 2018 года - обновленная версия 2017 года для 14.15.26706, обновленные зависимости Visual C++, поставляемые с VS 2017 15.8.1
16 мая 2018 года - обновленная версия 2017 года для 14.14.26405.0 как новая запись C++ 2017
8 сентября 2017 г. - обновленная версия 2017 г. для 14.11.25325.0 в качестве новой записи Visual C++ 2017
7 апреля 2017 г. - Обновленная версия 2017 г. от 14.10.25008.0 в качестве новой записи Visual C++ 2017
24 октября 2016 г. - Обновлена информация о версии 2015 для 14.0.24215.1
18 августа 2016 г. - Обновлена информация о версии 2015 для 14.0.24212.
27 мая 2016 г. - Обновлена информация для MSVC2015, обновление 2
Пожалуйста, свяжитесь со мной здесь, если какой-либо из них устарел.
Пытаться
HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
в качестве отправной точки. Я буду использовать это как проверку для установки среды выполнения VC++ 11 (VS 2012).
Вы можете проверить на Installed
ценность быть 1
в этом месте реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
на 64-битных системах. В коде, который приведет к доступу к разделу реестра 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. Думаю, Microsoft хочет всегда устанавливать, если вы установите его в качестве предварительного условия.
Конечно, вы все равно можете вызвать MsiQueryProductState, чтобы проверить, установлен ли пакет переадресации VC через MSI. Код пакета можно найти, запустив
wmic product get
в командной строке или, если вы уже находитесь в wmic:root\cli, запустите
product where "Caption like '%C++ 2012%'"
Ответ на эти простые вопросы, к сожалению, не простой, но работает в 100% всех систем и даже распространяется на многочисленные.net-фреймворки.
Сложность возникает из-за того, что существует (и было) много версий среды выполнения VC, что может привести к тому, что, хотя среды выполнения VC10 были установлены, их номер сборки был недостаточно свежим, поэтому ваш EXE-файл не запустился, если вы не установили точное время выполнения, которое вам требуется, или одно из более новых сред выполнения, которые позволяют этой и предыдущей версиям для одной и той же основной версии работать с ней (адский бок о бок). Кроме того, если у вас есть 64-битный EXE-файл, вам придется проверить как 32-разрядную, так и 64-разрядную среды выполнения.
Тем не менее, единственный надежный способ определить, установлены ли среды выполнения для вашего EXE-файла, - это попытаться запустить EXE- файл или другой EXE-файл, созданный с теми же настройками, что и ваш основной EXE-файл, и единственная цель которого - ничего не делать. Просто запустите (что означает, что среды выполнения установлены) или не запустите (если не установлены).
Для установщика, который требовал установки 32 и 64-разрядных сред выполнения VC10, я сделал следующее: Установщик пытается запустить все фиктивные EXE-файлы, и в случае успеха соответствующая среда выполнения считается установленной. Это также разрешает 32/64 битный сценарий.
Это, кстати, также помогает определить, установлена ли надлежащая платформа.net, что очень сложно в Windows 8 и 10, поскольку загружаемая встроенная поддержка.net 3.5 также поддерживает.net версий 3.0 и 2.0 - там нет записей реестра для них. (И что еще хуже, вы не можете даже использовать стандартные установщики фреймворка здесь, вы должны использовать встроенную поддержку и загрузить ее через Windows, или пересобрать ваше приложение с помощью.net 4, но это уже другая история).
Фиктивный EXE-файл C++ может быть собран с использованием проекта со следующим кодом (и еще один в 64-битной конфигурации при необходимости):
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Не забудьте установить свойства проекта Использование MFC для использования MFC в общей DLL. Размер исполняемых файлов составит около 4 КБ - небольшая цена за определенный результат.
Чтобы дать вашим пользователям хороший опыт установки, вы можете сделать следующее (пример кода для 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).
Я наткнулся на этот вопрос в поисках ответа в контексте проверки на распространяемость Visual C++ в рамках программы установки MSI, созданной WiX.
Мне не понравилось, как меняется GUID в зависимости от версии и операционной системы, поэтому я в итоге создал собственное действие, написанное на C#, для проверки на распространяемость Visual C++.
Все, что ниже, специально предназначено для распространяемого Visual C++ 2015 (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>
Просто зайдите в Панель управления> Программы и компоненты, и все они появятся там в списке.
Я не эксперт, и этот ответ довольно прост по сравнению с тем, что люди отвечают (проверяют реестр), поэтому я не уверен, что это правильный ответ, но он помог мне.
Для меня это место работало: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevDiv\vc\Servicing\11.0\RuntimeMinimum\Version
Проверьте, какая у вас версия после установки пакета, и используйте ее в качестве условия в вашем установщике. (у меня установлено значение 11.0.50727 после установки VCred).
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
Этот код PowerShell должен сделать свое дело
Get-ItemProperty
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table –AutoSize
Мне удалось сделать это с InnoSetup.
Я проверил наличие ключа реестра:
HKLM\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes
Если удалить его, он не существует. Если установлено, оно существует.
Кстати, это также может быть в Wow6432Node:
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes
Проверка состояния установки продукта с помощью MsiQueryProductState в значительной степени эквивалентна проверке реестра напрямую, но вам все еще нужен GUID для ProductCode.
Как уже упоминалось в другом месте, одним из недостатков этих подходов является то, что каждое обновление имеет свой собственный код продукта!
К счастью, MSI предоставляет код UpgradeCode, который идентифицирует "семейство" продуктов. Вы можете использовать orca, чтобы открыть один из MSI для извлечения этой информации. Например, распространяемый код UpgradeCode для VS2015 имеет вид {65E5BD06-6392-3027-8C26-853107D3CF1A}
Вы можете использовать MsiEnumRelatedProducts, чтобы получить все идентификаторы продуктов для этого кода UpgradeCode. На практике, поскольку каждое повторное обновление заменяет предыдущее, это приведет только к одному ProductCode - такому как {B5FC62F5-A367-37A5-9FD2-A6E137C0096F}
для VS2015 Обновление 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++ регистрируют свой деинсталлятор в 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 без необходимости явной проверки обоих ключей.
Также обратите внимание, что для обновления приведенного выше кода на другую версию Redist VC++ просто измените GUID в пути к ключу реестра и отображаемое имя на все, что вам нужно.
Хотя это, возможно, и не рекомендуемый метод, за последние 10 лет он работал на более чем 10000 компьютерах, выполняя все варианты окон от XP/XP64 до Windows 10, используя переадресацию для 2005, 2010, 2010sp1 и теперь 2012u4.
Я бы проверил Installed
ценность
HKLM\SOFTWARE\[WOW6432Node]\Microsoft\Windows\CurrentVersion\Uninstall\{VCRedist_GUID}
ключ
- где GUID из
VC++ 2012 (x86)
является{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
WOW6432Node
будет присутствовать или нет в зависимости отVC++ redist
товар
Я использую этот лайнер для PowerShell в Server 2019 и Windows 10. Я не знаю, насколько он обратно совместим.
Get-CimInstance -Class Win32_Product -Filter "Name LIKE '%Visual C++ %Redistri%'" | Select Name, Caption, Version
То, что большинство людей пропускают, является необходимым /reg:32
проверить ключ на Windows x64.
См. Статью справки Microsoft на эту тему.
Вот скрипт, который демонстрирует, как правильно проверять распространяемость Visual C++ для 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
Решение сценария powershell:
На основании информации в ответе от @kayleeFrye_onDeck
Я создал скрипт powershell, который проверяет и устанавливает версии, указанные пользователем, я не проводил с ним всестороннего тестирования, но для моего собственного сценария CI (Continuous Integration) он отлично работает.
Полный скрипт и информация о github
Подход, который я использовал, был основан на проверке повторных ключей на основе информации, представленной здесь. Ниже приводится суть того, что делает скрипт:
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's.
$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
Любой желающий может внести свой вклад, если у меня будет время, я проведу более тщательное тестирование сценария и продолжу пытаться добавлять новые пакеты, так как здесь добавляется информация.
Получить все значения реестра для 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;
Вы можете искать в реестре. На самом деле у меня нет vs2012, но у меня есть vs2010.
Есть 3 разных (но очень похожих) ключа реестра для каждого из 3 пакетов платформы. Каждый ключ имеет значение 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
Вы можете использовать функцию реестра для этого......