PowerShell: неправильный порядок сортировки объектов по убыванию

В настоящее время у нас есть следующая структура папок:

      C:\Packages\Adobe\DC\9.2.2
C:\Packages\Adobe\DC\10.0.3
C:\Packages\Adobe\DC\10.0.8

C:\Packages\Microsoft\Edge\6.1.10
C:\Packages\Microsoft\Edge\6.1.18
C:\Packages\Microsoft\Edge\6.1.20

С помощью сценария PowerShell я стараюсь сохранить только самую высокую версию соответствующей папки приложения и удалить все остальные. Результат должен быть:

      C:\Packages\Adobe\DC\10.0.8

C:\Packages\Microsoft\Edge\6.1.20

Однако в моем скрипте сортировка не работает должным образом.

      $folders_root = Get-ChildItem -Path C:\Packages -Directory

foreach ($folder in $folders_root)
{
    $folders_appilcation = Get-ChildItem $folder.FullName -Directory

    foreach ($app_folder in $folders_appilcation)
    {
        $versionfolder = Get-ChildItem $app_folder.FullName -Directory | Sort-Object -Descending | Select-Object -Skip 1 | % {Write-host "Deleting $($_.FullName)"<#;  Remove-Item $_.FullName#>}

    }
}

Для пути "C:\Packages\Adobe\DC" 9.2.2 считается самой старшей версией (согласно сценарию), но она должна быть 10.0.8.

      Deleting C:\Packages\Adobe\DC\10.0.8
Deleting C:\Packages\Adobe\DC\10.0.3
Deleting C:\Packages\Microsoft\Edge\6.1.18
Deleting C:\Packages\Microsoft\Edge\6.1.10

Может кто подскажет, что я делаю не так?

2 ответа

Решение

Сортировка - это сравнение строк, а не чисел. Когда вы сравниваете строку 10 и 9, она интерпретирует 10 как 1.

Заставьте сортировать нам его как версию, попробуйте что-нибудь вроде этого:

      sort {[version]::Parse(($_.split("\"))[-1])} -Descending

Спасибо. Следующий код отлично работает:

      $folders_root = Get-ChildItem -Path \\hkt-cmgmt01a\d$\Empirum\Configurator\Packages -Directory

foreach ($folder in $folders_root)
{
    $folders_appilcation = Get-ChildItem $folder.FullName -Directory

    foreach ($app_folder in $folders_appilcation)
    {
        $versionfolder = Get-ChildItem $app_folder.FullName -Directory | Sort-Object { [version] $_.Name } -Descending -ErrorAction SilentlyContinue| Select-Object -Skip 1 | % {Write-host "Deleting $($_.FullName)"<#;  Remove-Item $_.FullName#>}

    }
}
Другие вопросы по тегам