Как программно отличить Excel 2019 от 2016 года? - PullRequest
1 голос
/ 03 апреля 2019

Я веду диагностику, которая программно определяет версию приложений MS Office, включая Excel и Word. Он корректно работал для версий MS Office 2003, 2007, 2010, 2013 и 2016. Но теперь я обнаружил, что он неправильно сообщает о приложениях MS Office 2019 как MS Office 2016.

Восемь лет назад М. А. Ханин написал похожий вопрос:

Программная идентификация версии Excel

ответ Мэтью, принятый ответ, коррелированные числа, используемые для идентификации MS Office в реестре по сравнению с версиями продукта. Например, число 14.0 соответствовало Office 2010. Дуг Глэнси непосредственно обратился к вопросу с помощью кода VB, который печатает свойство версии объекта приложения Excel:

https://docs.microsoft.com/en-us/office/vba/api/excel.application.version

Вот скрипт VB, который определяет, какая версия Excel установлена ​​в системе (если есть):

On Error Resume Next
Set excelApp = CreateObject("Excel.Application") 
If Err.Number <> 0 Then
    WScript.Echo "Excel is not installed"
Else
    Wscript.Echo "Excel Version: " & excelApp.Version 
End If

Диагностическое сообщение достоверно сообщает о версиях MS Office, соответствующих сообщению от 2011 года. С тех пор оно сообщает 15.0 для Office 2013 и 16.0 для Office 2016. Однако недавно я с удивлением обнаружил, что он также сообщает 16.0 для Office 2019 Это просто не правильно! Наборы функций 2016 и 2019 годов четко различаются, поэтому их не следует объединять:

https://support.office.com/en-us/article/what-s-new-in-office-2019-5077cbbe-0d94-44cc-b30e-654e37629b0c?ui=en-US&rs=en-US&ad=US

Есть ли альтернативный способ программно отличить Office 2016 от Office 2019?

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Вы можете попытаться проанализировать excelApp.Path, чтобы узнать путь установки.Это будет работать, если новый офис установлен в C: * \ Office 19 \ Excel.exe

0 голосов
/ 06 апреля 2019

Да, v16 может быть 2016 или 2019

Это работает для версии для меня.

:GetOfficeVer
set vbs="%temp%\_.vbs"
if exist %vbs% del /f /q %vbs%
    >%vbs% @echo off
    >>%vbs% echo Option Explicit ' Enforce variable declaration
    >>%vbs% echo Dim oShell
    >>%vbs% echo Dim lOfficeVersion
    >>%vbs% echo Set oShell = CreateObject("WScript.Shell")
    >>%vbs% echo On Error Resume Next
    >>%vbs% echo lOfficeVersion = GetOfficeVersionNumber() 
    >>%vbs% echo MsgBox "OfficeVersion = " ^& lOfficeVersion
    >>%vbs% echo     Function GetOfficeVersionNumber()
    >>%vbs% echo         GetOfficeVersionNumber = "" 
    >>%vbs% echo         Dim sTempValue
    >>%vbs% echo         sTempValue = oShell.RegRead("HKCR\Excel.Application\CurVer\")
    >>%vbs% echo         If Len(sTempValue) ^> 2 Then GetOfficeVersionNumber = Replace(Right(sTempValue, 2), ^".^", ^"^")
    >>%vbs% echo     End Function   
cscript //nologo %vbs%
pause
if exist %vbs% del /f /q %vbs%
endlocal
goto :EOF
0 голосов
/ 05 апреля 2019

Обходной путь - проанализировать номер версии из выходных данных средства управления лицензиями программного обеспечения клиента MS Office, OSPP.VBS, с параметром / dstatus. Вот пример сценария CMD, который демонстрирует обходной путь:

:: GetOfficeVer.cmd - Print the version of a licensed MS Office package.
::   Prerequisite:
::      Copy this cmd script to a folder including these MS Office files:
::          * OSPP.VBS    - MS Office Software Protection Platform script.
::          * OSPP.HTM    - Help file for OSPP.VBS.
::          * SLERROR.XML - Data file for OSPP.VBS.
::   Syntax:
::      GetOfficeVer [ComputerName[ PackageAbbr]]
::        ComputerName    - Windows system name  (defaults to local system)
::        PackageAbbr     - Package abbreviation (list below is not exhaustive)
::          *  ProPlus    - Office Professional Plus (default)
::          *  VisioPro   - Visio Professional
::          *  InfoPath   - InfoPath Designer
::   Return Values:
::          *  If the package is licensed, print the MS Office package version
::             string using the MS Office Application.Version property format.
::          *  If the package is unlicensed, print an empty line.
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
if %2_==_ (set MSO_PKG=ProPlus) else (set MSO_PKG=%2)
set "MSO_PKG_LIC=cscript "%~dp0\OSPP.VBS" /dstatus %1 | findstr /R /C:"^LICENSE NAME:.*%MSO_PKG%""
for /f "tokens=1-4 delims=, " %%G in ('!MSO_PKG_LIC!') do (set MSO_VER=%%J)
if %MSO_VER%_==_ (echo.) else ( echo %MSO_VER%.0)
endlocal

Советы по использованию OSPP.VBS:

  • Выполнение может занять несколько секунд.
  • Он включен в папку, хранящуюся в свойстве Application.Path.
  • Он не требует установки MS Office в систему, из которой он запущен.
  • Для этой цели его не нужно запускать с повышенными правами.
  • Не удастся, если целевая система нуждается в перезапуске.
  • Версии с 2013, 2016 и 2019 гг. Работают против всех трех версий.
...