Как получить версию файла в 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.
Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.

