您如何使用PowerShell对此文件名列表进行排序,以便它们以降序版本的形式出现?
我只需要最高版本的文件名。
Name
----
CYFS_PreK_1_0_1_10
CYFS_PreK_1_0_1_11
CYFS_PreK_1_0_1_12
CYFS_PreK_1_0_1_13
CYFS_PreK_1_0_1_14
CYFS_PreK_1_0_1_15
CYFS_PreK_1_0_1_16
CYFS_PreK_1_0_1_17
CYFS_PreK_1_0_1_18
CYFS_PreK_1_0_1_19
CYFS_PreK_1_0_1_20
CYFS_PreK_1_0_1_21
CYFS_PreK_1_0_1_22
CYFS_PreK_1_0_1_23
CYFS_PreK_1_0_1_8
CYFS_PreK_1_0_1_9
以下将选择" CYFS_PreK_1_0_1_9" ,因为它是按字母顺序排列的最高数字,因为版本号中没有前导零。
$lastVersion = get-childitem $src |
sort-object -descending |
select-object -First 1 -Property:Name
但是,我正在寻找" CYFS_PreK_1_0_1_23"
更新
如果我们只关心最后一组数字,我们可以拆分下划线的名称,并以数字方式对最后一段进行排序。
Get-ChildItem $_ |
Sort-Object {[int] $_.Name.Split("_")[5]} -Descending |
select-object -First 1 -Property:Name
这适用于此套装,但是,如果我们转到版本1_0_2_x,那么它会再次中断,因为1_0_2_1中的最后1在1_0_1_23中小于23。
答案 0 :(得分:19)
您可以使用[Version]类型进行版本排序。这只考虑了版本(所以它不关心文件名的开头):
dir $_ |
Sort-Object {
[Version] $(if ($_.BaseName -match "(\d+_){3}\d+") {
$matches[0] -replace "_", "."
}
else {
"0.0.0.0"
})
} | select -last 1 -ExpandProperty Name
答案 1 :(得分:3)
可能有更好的方法,但这有效:
Get-ChildItem $_ |
Sort-Object {[int]$_.Name.Split("_")[2], [int]$_.Name.Split("_")[3], [int]$_.Name.Split("_")[4], [int]$_.Name.Split("_")[5]} -Descending |
select-object -First 1 -Property:Name
答案 2 :(得分:0)
ls | sort -Descending { [version]($_ -replace 'CYFS_PreK_' -replace '_','.') }
Directory: /Users/js/foo
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 7/22/19 8:34 PM 3 CYFS_PreK_1_0_1_10
------ 7/22/19 8:34 PM 3 CYFS_PreK_1_0_1_9
------ 7/22/19 8:34 PM 3 CYFS_PreK_1_0_1_8