Недавно мы обновили версию Powershell на наших серверах сборки с 4.0 до 5.0. Это изменение привело к тому, что один из наших скриптов сборки неожиданно начал сбой.
Код используется для определения того, какие руководства пользователя должны быть включены в наш продукт. Код обрабатывает список узлов xml, которые описывают все доступные документы с версией и культурой. Мы группируем по названию документа и культуре, а затем выбираем наиболее подходящую версию.
$documents = Get-ListItemsFromSharePoint
$documents = $documents |
Where-Object { $productVersion.CompareTo([version]$_.ows_Product_x0020_Version) -ge 0 } |
Where-Object { -not ($_.ows_EncodedAbsUrl.Contains('/Legacy/')) }
Write-Verbose -Message "Filtered to: $($documents.length) rows"
# Filter to the highest version for each unique title per language
$documents = $documents | Group-Object { $_.ows_Title, $_.ows_Localisation } |
ForEach-Object {
$_.Group | Sort-Object { [version]$_.ows_Product_x0020_Version } -Descending | Select-Object -First 1
}
В Powershell 4 этот код правильно сортирует документы по названию и культуре, а затем выбирает наиболее подходящую версию. В Powershell 5 этот код группирует все документы в одном списке, а затем выбирает наиболее подходящую версию из этого списка. Учитывая, что у нас есть документы на нескольких языках, это означает, что будет присутствовать только язык с наиболее подходящей версией.
Проблема была исправлена путем изменения
$documents = $documents | Group-Object { $_.ows_Title, $_.ows_Localisation } |
к
$documents = $documents | Group-Object ows_Title, ows_Localisation |
Теперь я понимаю, что первый синтаксис не является технически корректным в соответствии с документацией, потому что Group-Object ожидает, что массив имен свойств будет включен, однако в Powershell 4 код действительно возвращает желаемые результаты.
Теперь вопрос в том, что изменилось в Powershell 5, что исходный код работал в Powershell 4, но не удалось в Powershell 5.