PowerShell 中 "System.Version" 的版本字符串太长(或太短)

Version strings to "System.Version" too long (or short) in PowerShell

如何在 PowerShell 中强制转换为类型 System.Version,或者更可能更好地理解为什么我不能任意分配数字字符串类型 System.Version

我们在标题包含版本号的文件夹中获取一些软件更新。在尝试获取有关摄取的最新版本的报告时,我一直在做以下快速而肮脏的事情:

ForEach ($Folder in $(Get-ChildItem -Path $SoftwareDirectory -Directory))
{
    $CurrentVersion = $Folder -Replace "[^0-9.]"
    If ($CurrentVersion -ne $null)
    {
        If ([System.Version]$CurrentVersion -gt [System.Version]$MaxVersion)
        {
            $MaxVersion = $CurrentVersion
            $MaxFolder = $Folder
        }
    }
}

这将提供如下目录标题,

大多数时候,这是可以接受的。但是,当遇到一些数字比较长的奇数时,像下面这样,

在这种情况下,System.Version 拒绝生成的字符串太长。

Cannot convert value "4331364" to type "System.Version". Error: "Version string portion was too short or too long."

您需要确保您的版本字符串至少有 两个 组件才能成功转换为 [version]

(
  @(
    'oo-tools-1.12.file'
    'bar-static-3.4.0.file'
    'applet-4u331r364.file'
  ) -replace '[^0-9.]'
).TrimEnd('.') -replace '^[^.]+$', '$&.0' | ForEach-Object { [version] $_ }

以上将 'applet-4u331r364.file' 转换为 '4331364.0',在转换为 [version] 时有效。

请注意,如果您排除开头的文件扩展名,则可以避免需要 .TrimEnd('.')$Folder.BaseName -replace '[^0-9.]'

-replace '^[^.]+$', '$&.0' 仅匹配不包含 . 个字符的字符串。替换表达式 $&.0 将文字 .0 附加到匹配的字符串 ($&).

输出(通过Format-Table -AutoSize):

Major   Minor Build Revision
-----   ----- ----- --------
1       12    -1    -1
3       4     0     -1
4331364 0     -1    -1