Powershell,按文件名末尾的版本号对文件列表进行排序?

标签 powershell

您将如何使用 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。

最佳答案

您可以使用 [Version] 类型进行版本排序。这只考虑版本(所以它不关心文件名的开头):

dir $_ |
    Sort-Object { 
        [Version] $(if ($_.BaseName -match "(\d+_){3}\d+") { 
                        $matches[0] -replace "_", "."
                    } 
                    else { 
                        "0.0.0.0"
                    })  
    } | select -last 1 -ExpandProperty Name

关于Powershell,按文件名末尾的版本号对文件列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25026672/

相关文章:

azure - 如何知道 azure 角色分配已经存在

powershell - 使用PowerShell删除5分钟之前的文件

powershell - 需要脚本来查找服务器激活状态

powershell - 停止关闭$ Host.UI.PromptForChoice窗口

powershell - 比较 Azure Properties.ContentMD5 和 Get-Filehash 之间的字符串输出

powershell - 基于空值变量从 Send-MailMessage 有条件地省略 CC 参数

powershell - 使用参数不在脚本文件中的Powershell

powershell - 设置打印机设置时出错

Powershell 2.0 脚本在 cmd.exe 中运行,但不在任务计划程序中

c# - 使用管道中的数据