如何通过PowerShell提取指定目录下最高版本的SNAPSHOT快照jar文件名
问题原因
原脚本直接截取文件名按-分割的最后一段转换为版本类型,对于带时间戳的SNAPSHOT命名格式,分割后的最后一段是带.jar后缀的构建号,不符合标准版本号格式要求,因此抛出转换错误。
最简实现脚本
$maxVersionJar = Get-ChildItem -Filter "app-SNAPSHOT-*.jar" | Sort-Object { # 正则同时适配新旧两种命名格式 if ($_.Name -match 'app-SNAPSHOT-(?:(\d+\.\d+\.\d+)-(\d{8}\.\d{6})-)?(\d+)\.jar') { # 排序优先级:语义化版本号 > 构建时间戳 > 构建序号 [version]($matches[1] ?? "0.0.0"), $matches[2] ? [datetime]::ParseExact($matches[2], "yyyyMMdd.HHmmss", $null) : [datetime]::MinValue, [int]$matches[3] } } -Descending | Select-Object -First 1 -ExpandProperty Name
脚本说明
- 自动兼容两类命名规则:早期的
app-SNAPSHOT-01.jar格式、带时间戳的标准SNAPSHOT格式 - 排序逻辑完全符合版本迭代规则:优先比对语义化版本号,版本号相同时比对构建时间,时间一致时比对构建序号
- 自动过滤不符合命名规则的文件,无需额外做异常处理
- 如果使用PowerShell 5.1及更低版本,不支持null合并运算符和三元运算符,可将排序块内的逻辑替换为如下写法:
if ($_.Name -match 'app-SNAPSHOT-(?:(\d+\.\d+\.\d+)-(\d{8}\.\d{6})-)?(\d+)\.jar') { $ver = if ($matches[1]) { [version]$matches[1] } else { [version]"0.0.0" } $time = if ($matches[2]) { [datetime]::ParseExact($matches[2], "yyyyMMdd.HHmmss", $null) } else { [datetime]::MinValue } $build = [int]$matches[3] $ver, $time, $build }
内容的提问来源于stack exchange,提问作者Dreamer
相关产品推荐
相关产品推荐

