Поиск по сайту:

Как получить версию файла в PowerShell


Мы можем использовать PowerShell, чтобы получить версию файла любого файла на вашем компьютере. Получение информации о версии может быть полезным для проверки успешности обновления программного обеспечения или развертывания, или для инвентаризации версий программного обеспечения на разных машинах.

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

Команда PowerShell для получения версии файла

Давайте рассмотрим несколько методов получения версии файла в PowerShell. Большинство методов практически одинаковы, поэтому просто используйте тот, который наиболее удобен для вас. Мы будем использовать исполняемый файл OneDrive в качестве примера для этого.

Используя Get-Item

Наиболее рекомендуемый способ получения информации о версии - использовать командлет Get-Item. Свойство FileVersion является частью свойства VersionInfo. Поместив командлет Get-Item в скобки, мы можем легко получить полный номер версии:

Set the file path (will be using this in all examples)
$file = "C:\Program Files\Microsoft OneDrive\OneDrive.exe"

Get version information with Get-Item
(Get-Item $file).VersionInfo.FileVersion

Вместо полного номера версии файла мы также можем получить сырой номер версии. Это разделит номер на основные, второстепенные, сборочные и ревизионные номера.

Это особенно полезно, когда вам нужно проверить только номер крупного или мелкого выпуска приложения.

(Get-Item $file).VersionInfo.FileVersionRaw

Result
Major  Minor  Build  Revision
-----  -----  -----  --------
24     181    908    1

Используя Get-ChildItem или Get-ItemProperty

Вместо командлета Get-Item мы также можем использовать командлеты Get-ChildItem или Get-ItemProperty. Как уже упоминалось, все 3 метода практически одинаковы:

Using Get-ChildItem
(Get-ChildItem $file).VersionInfo.FileVersion

Using Get-ItemProperty
(Get-ItemProperty $file).VersionInfo.FileVersion

Я провел некоторые тесты, чтобы проверить, является ли один метод быстрее, и, как и ожидалось, разница между тремя минимальна после 50 тестов:

  • Среднее время выполнения Get-Item: 1.078332 мс
  • Среднее время для Get-ChildItem: 1.108278 мс
  • Среднее время для Get-ItemProperty: 1.02891 мс

Использование класса System.Diagnostics.FileVersionInfo .NET

Другой метод получения информации о версии файла заключается в использовании класса System.Diagnostics.FileVersionInfo .NET. Преимуществом прямого использования класса .NET является то, что он быстрее, чем другие три метода.

([System.Diagnostics.FileVersionInfo]::GetVersionInfo($file)).FileVersion

Разница не такая уж и большая, но когда вам нужно получить информацию о версиях для множества файлов или проверить это на многих машинах, это может сэкономить вам время. С классом .NET в среднем на получение информации о версии уходило всего 0,79294 мс, что делает его примерно на 20% быстрее других методов.

Пользовательская функция Get-FileVersion

Если вам нужно регулярно проверять версию файла, имеет смысл создать пользовательскую функцию и сохранить её в вашем профиле PowerShell. Таким образом, вы сможете легко получать информацию о версии с помощью удобной команды, вместо того чтобы использовать командлет Get-Item со всеми правильными свойствами.

Вы можете скопировать и вставить функцию ниже в ваш профиль PowerShell:

function Get-FileVersion {
    param (
        [string]$FilePath,
        [switch]$raw = $false
    )

    if (-not (Test-Path $FilePath)) {
        Write-Error "File not found: $FilePath"
        return
    }

    try {
        $versionInfo = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($FilePath)

        if (-not($raw)) {
            return $versionInfo.FileVersion
        }else{
            return $versionInfo.FileVersionRaw
        }
    } catch {
        Write-Error "Unable to get version info for: $FilePath"
    }
}

Таким образом, вы можете просто использовать следующую команду в своих сеансах PowerShell:

Get-FileVersion "C:\Program Files\Microsoft OneDrive\OneDrive.exe"

По умолчанию он вернет номер версии файла для данного файла. Если вы добавите параметр -raw, то получите номер версии, разделенный на основные, второстепенные, сборочные и ревизионные номера.

Сравнение версий файлов

Когда вам нужно сравнить версии файлов, важно привести номер версии к типу [version]. В противном случае PowerShell выполнит строковое сравнение, которое не так точно в сочетании с номерами версий.

Тип [Version] создан для сравнения версий, которые содержат несколько числовых компонентов, таких как главный, вспомогательный, номер сборки и номер ревизии. Таким образом, PowerShell знает, как обрабатывать сравнения между номерами версий, что в противном случае невозможно с помощью обычных строковых сравнений.

Get the file version and cast it to a [Version] object
$version = [Version]((Get-Item $file).VersionInfo.FileVersion)

Define the target version for comparison, also cast to [Version]
$targetVersion = [Version]"24.180.708.1"

Compare the versions
if ($version -gt $targetVersion) {
    Write-Host "The file version is newer than 24.180.708.1"
} else {
    Write-Host "The file version is older or equal to 24.180.708.1"
}

Заключение

Существует несколько способов получить информацию о версии файла с помощью PowerShell. Тем не менее, обычные командлеты довольно похожи по удобству использования и производительности.

Если вам нужно извлекать информацию из множества файлов, имеет смысл использовать более быстрый класс .NET. Также убедитесь, что вы опробовали пользовательскую функцию в своем профиле PowerShell.

Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.