Как получить "версию продукта" файла в VBScript - PullRequest
9 голосов
/ 04 июня 2010

У меня есть VBScript, который проверяет наличие файла в каталоге на удаленной машине. Я пытаюсь получить " Версия продукта " для указанного файла ( NOT" Версия файла "), но не могу понять, как сделать это в VBScript.

В настоящее время я использую Scripting.FileSystemObject для проверки существования файла.

Спасибо.

Ответы [ 5 ]

11 голосов
/ 07 июня 2010

Я использую функцию, которая немного изменена по сравнению с предыдущим примером. Функция берет путь и имя файла и возвращает «Версия продукта»

Function GetProductVersion (sFilePath, sProgram)
Dim FSO,objShell, objFolder, objFolderItem, i 
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FileExists(sFilePath & "\" & sProgram) Then
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(sFilePath)
    Set objFolderItem = objFolder.ParseName(sProgram)
    Dim arrHeaders(300)
    For i = 0 To 300
        arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
        'WScript.Echo i &"- " & arrHeaders(i) & ": " & objFolder.GetDetailsOf(objFolderItem, i)
        If lcase(arrHeaders(i))= "product version" Then
            GetProductVersion= objFolder.GetDetailsOf(objFolderItem, i)
            Exit For
        End If
    Next
End If
End Function

Я обнаружил, что положение атрибутов иногда меняется (не знаю почему) в XP и Vista, поэтому я ищу атрибут «версия продукта» и выхожу из цикла, когда он найден. Закомментированная строка покажет все атрибуты и значение, если доступно

3 голосов
/ 05 июня 2010

Вы можете использовать Shell.Namespace , чтобы получить расширенные свойства для файла, одним из которых является Версия продукта. Функция GetDetailsOf должна работать. Вы можете проверить с помощью следующего кода, чтобы получить представление:

Dim fillAttributes(300)

Set shell = CreateObject("Shell.Application")
Set folder = shell.Namespace("C:\Windows")

Set file = folder.ParseName("notepad.exe")

For i = 0 to 299
    Wscript.Echo i & vbtab & fillAttributes(i) _
        & ": " & folder.GetDetailsOf(file, i) 
Next

Одна вещь, о которой нужно знать:

Расширенные свойства файла отличаются в разных версиях Windows. Следовательно, номера индексов версий продукта меняются в зависимости от используемой версии Windows. Вы можете использовать код выше, чтобы определить, что они есть. Из моего тестирования я считаю, что они следующие:

  • Окно XP - 39
  • Windows Vista - 252
  • Windows 7 - 268
  • Windows 2008 R2 SP1 - 271
  • Windows 2012 R2 - 285

Вы также можете найти следующую запись полезной.

0 голосов
/ 28 октября 2011
' must explicitly declare all variables
Option Explicit
' declare global variables
Dim aFileFullPath, aDetail
' set global variables
aFileFullPath = "C:\Windows\Notepad.exe"
aDetail = "Product Version"
' display a message with file location and file detail
WScript.Echo ("File location: " & vbTab & aFileFullPath & vbNewLine & _
aDetail & ": " & vbTab & fGetFileDetail(aFileFullPath, aDetail))
' make global variable happy. set them free
Set aFileFullPath = Nothing
Set aDetail = Nothing
' get file detail function. created by Stefan Arhip on 20111026 1000
Function fGetFileDetail(aFileFullPath, aDetail)
' declare local variables
Dim pvShell, pvFileSystemObject, pvFolderName, pvFileName, pvFolder, pvFile, i
' set object to work with files
Set pvFileSystemObject = CreateObject("Scripting.FileSystemObject")
' check if aFileFullPath provided exists
If pvFileSystemObject.FileExists(aFileFullPath) Then
' extract only folder & file from aFileFullPath
pvFolderName = pvFileSystemObject.GetFile(aFileFullPath).ParentFolder
pvFileName = pvFileSystemObject.GetFile(aFileFullPath).Name
' set object to work with file details
Set pvShell = CreateObject("Shell.Application")
Set pvFolder = pvShell.Namespace(pvFolderName)
Set pvFile = pvFolder.ParseName(pvFileName)
' in case detail is not detected...
fGetFileDetail = "Detail not detected"
' parse 400 details for given file
For i = 0 To 399
' if desired detail name is found, set function result to detail value
If uCase(pvFolder.GetDetailsOf(pvFolder.Items, i)) = uCase(aDetail) Then
fGetFileDetail = pvFolder.GetDetailsOf(pvFile, i)
End If
Next
' if aFileFullPath provided do not exists
Else
fGetFileDetail = "File not found"
End If
' make local variable happy. set them free
Set pvShell = Nothing
Set pvFileSystemObject = Nothing
Set pvFolderName = Nothing
Set pvFileName = Nothing
Set pvFolder = Nothing
Set pvFile = Nothing
Set i = Nothing
End Function
0 голосов
/ 08 сентября 2011
Wscript.Echo CreateObject("Scripting.FileSystemObject").GetFileVersion("C:\Windows\notepad.exe")
0 голосов
/ 05 июня 2010

Я не думаю, что вы можете сделать это в vbScript. Я могу ошибаться в этом.

Вот ссылка на скрипт powershell, который делает то, что вы просите.

текст ссылки

Вот как выглядит вывод для моего каталога Windows.

    PS Scripts:\> ls c:\windows\*.exe | .\get-fileversion.ps1

ProductVersion   FileVersion      FileName
--------------   -----------      --------
2.7.3.0          2.7.3.0          C:\windows\agrsmdel.exe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...