当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何在 PowerShell 中获取文件版本

作者:精品下载站 日期:2024-12-14 01:59:19 浏览:15 分类:玩电脑

如何在 PowerShell 中获取文件版本


我们可以使用 PowerShell 来获取计算机上任何文件的文件版本。获取版本信息对于检查软件更新或部署是否成功或清点不同计算机上的软件版本很有用。

在本文中,我将向您展示如何快速获取文件版本信息,检查版本是否高于或低于指定版本号,并在 PowerShell 配置文件中为您创建自定义函数以使其更加轻松。

PowerShell 获取文件版本

让我们看一下在 PowerShell 中获取文件版本的几种方法。大多数方法几乎相同,因此只需使用对您来说最方便的一种即可。我们将使用 OneDrive 可执行文件作为示例。

使用获取项目

获取版本信息的最推荐方法是使用 Get-Item cmdlet。 FileVersion 属性是 VersionInfo 属性的一部分。通过将 Get-Item cmdlet 放在括号之间,我们可以轻松获取完整的版本号:

# 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

[玩转系统] 如何在 PowerShell 中获取文件版本

我们还可以获得原始版本号,而不是完整的文件版本号。这会将数字分为主要编号、次要编号、内部版本号和修订号。

当您只需要检查应用程序的主要或次要版本号时,这特别有用。

(Get-Item $file).VersionInfo.FileVersionRaw

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

使用 Get-ChildItem 或 Get-ItemProperty

我们还可以使用 Get-ChildItem Get-ItemProperty cmdlet,而不是 Get-Item cmdlet。如前所述,这 3 种方法几乎相同:

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

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

[玩转系统] 如何在 PowerShell 中获取文件版本

我已经运行了一些测试来检查一种方法是否更快,正如预期的那样,在运行 50 次测试后,三种方法之间的差异很小:

  • Get-Item 的平均时间:1.078332 ms
  • Get-ChildItem 的平均时间:1.108278 ms
  • 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 cmdlet。

您可以将以下函数复制并粘贴到您的 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 会话中使用以下 cmdlet:

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 获取文件版本信息。然而,就可用性和性能而言,普通的 cmdlet 几乎是相同的。

如果您需要从大量文件中检索信息,那么速度更快的 .NET 类就有意义。另外,请确保在 PowerShell 配置文件中尝试自定义函数。

希望您喜欢这篇文章,如果您有任何疑问,请在下面发表评论。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯