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
}
}
}
这将提供如下目录标题,
- foo-tools-1.12.file
- bar-static-3.4.0.file
大多数时候,这是可以接受的。但是,当遇到一些数字比较长的奇数时,像下面这样,
- 小程序-4u331r364.file
在这种情况下,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
如何在 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
}
}
}
这将提供如下目录标题,
- foo-tools-1.12.file
- bar-static-3.4.0.file
大多数时候,这是可以接受的。但是,当遇到一些数字比较长的奇数时,像下面这样,
- 小程序-4u331r364.file
在这种情况下,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