You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:54:06