首页 > 解决方案 > 以正确的顺序对文件进行排序

问题描述

我想以正确的顺序对某些文件进行排序,以便稍后使用网格选择它们。为此,我使用以下命令:

 $choose = Get-ChildItem $environment\Aither\Srv\Ptah\Tables\*.sql -Filter "*patch_5*.sql" -File | 
    # sorted by a calculated name
    Sort-Object { if ($_.BaseName -match '(.+-RC)(\d+)$') { '{0}{1:D3}{2}' -f $matches[1], [int]$Matches[2], $_.Extension }
                  else { '{0}-RC999{1}' -f $_.BaseName, $_.Extension } } |
    Out-GridView -Title "Select your files" -OutputMode Multiple
    $choose

我得到:

在此处输入图像描述

通过将 RC 文件放在没有它们的文件之后,文件可以很好地排序。但是,我有一个问题,旧文件放错了位置,我想知道是否可以对它们进行排序,同时将 RC 放在后面。

之前的示例:patch_5.0.10;补丁_5.0.11;补丁_5.0.5;... 补丁_5.1.0-RC2 ;

所需示例:patch_5.0.5;补丁_5.0.10;补丁_5.0.11;...补丁_5.1.0-RC2;

标签: powershell

解决方案


您需要指定一个计算出来的文件名以进行排序。
根据您可能有多少次修订,我想对这些数字进行正确排序也很重要。

假设您有一组文件(没有排序)在 gridview 中看起来像这样:

在此处输入图像描述

然后按照你想要的方式排序,并在数字上正确,你需要做这样的事情:

Get-ChildItem 'D:\Test' -Filter "*patch_5*.sql" -File | 
    # sort by a calculated name
    Sort-Object { if ($_.BaseName -match '(.+-RC)(\d+)$') { '{0}{1:D3}{2}' -f $matches[1], [int]$Matches[2], $_.Extension }
                  else { '{0}-RC999{1}' -f $_.BaseName, $_.Extension } } |
    Out-GridView -Title "Select your files" -OutputMode Multiple

GridView 中的输出:

在此处输入图像描述

以上假设您没有超过 998 个修订版。如果您有更多,请更改{1:D3}为块中的更高位数{1:D4}if并将硬编码更改RC999为同样最高的数字,例如RC9999


推荐阅读