Определить, установлен ли распространяемый 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

Вы можете использовать функцию реестра для этого......

Другие вопросы по тегам