根据文件名中间的版本号对文件进行排序

时间:2017-07-08 01:43:56

标签: powershell sorting powershell-v2.0 powershell-v3.0 version-sort

我是电源外壳新手。我正在尝试对名称中间有版本号的文件列表进行排序。

以下是文件列表:

sample-file-1.1.0-patch.zip
sample-file-1.1.1-patch.zip
sample-file-1.1.2-patch.zip
sample-file-1.1.2.1-fix-patch.zip
sample-file-1.1.3-patch.zip
sample-file-1.1.3.1-fix-patch.zip
..
sample-file-1.1.15-patch.zip
sample-file-1.1.15.1-fix-patch.zip
sample-file-1.1.15.2-fix-patch.zip
..
sample-file-2.0.0-patch.zip
sample-file-2.0.1-patch.zip
..

我会请求你帮我解决排序逻辑。

由于

1 个答案:

答案 0 :(得分:7)

您的示例输入最简单的方法如下,假设-后的第一个数字开始版本号,并以后续-之前的最后一个数字结束:

Get-ChildItem *.zip | Sort-Object { [version]($_.Name -replace '^[^\d]+-(.*\d)-.*', '$1') } 
  • $_.Name -replace '^[^\d]+-(.*\d)-.*', '$1'从字符串中提取每个文件名的版本号。

  • [version]将该字符串强制转换为版本号对象(System.Version [1] ,可根据版本号组件进行排序。

  • 将整个表达式作为脚本块{ ... }传递给Sort-Object意味着排序基于脚本块返回的[version]实例,并针对每个输入文件名进行评估。

[1] PSv5.1引入了基于semantic versioning的相关类型[System.Management.Automation.SemanticVersion],但这不适用于此,因为它只支持 3 版本号组件。