Niedawno zaktualizowaliśmy wersję Powershell na naszych serwerach budowania od 4.0 do 5.0. Ta zmiana spowodowała, że jeden z naszych skryptów kompilacji zaczął działać niepoprawnie.Jaka zmiana w Powershell 5 zmienia znaczenie nawiasów klamrowych bloku
Kod służy do określenia, które przewodniki użytkownika powinny być dołączone do naszego produktu. Kod przetwarza listę węzłów XML, które opisują wszystkie dostępne dokumenty z wersją i kulturą. Grupujemy według tytułu dokumentu i kultury, a następnie wybieramy najbardziej odpowiednią wersję.
$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
}
W pakiecie Powershell 4 ten kod poprawnie sortuje dokumenty według tytułu i kultury, a następnie wybiera najbardziej odpowiednią wersję. W pakiecie Powershell 5 ten kod grupuje wszystkie dokumenty na jednej liście, a następnie wybiera najbardziej odpowiednią wersję z tej listy. Biorąc pod uwagę, że mamy dokumenty w wielu językach, oznacza to, że będzie obecny tylko język o najbardziej odpowiedniej wersji.
Problem został rozwiązany przez zmianę
$documents = $documents | Group-Object { $_.ows_Title, $_.ows_Localisation } |
do
$documents = $documents | Group-Object ows_Title, ows_Localisation |
teraz rozumiem, że pierwsza składnia nie jest technicznie poprawne zgodnie z dokumentacją ponieważ Group-Object spodziewa tablicę nazw własności zgrupować, jednak w Powershell 4 kod zwrócił pożądane wyniki.
Teraz powstaje pytanie, co zmieniło się w PowerShell 5, że oryginalny kod pracował w PowerShell 4, ale nie powiodło się w PowerShell 5.
Widzę to samo, jeśli testuję pliki grupujące ('ls | grupa {$ _. Length, $ _. Nazwa} '). Nie wygląda jak dokumenty dla [PSv4] (https://technet.microsoft.com/library/hh849907.aspx) i [PSv5] (https://technet.microsoft.com/en-gb/library/hh849907 (v = wps.630) .aspx) odzwierciedlają wszelkie zmiany. Spójrz na przykłady 3 i 6 - to jest poprawna składnia dla obliczonej właściwości. Mam wrażenie, że w wersji 4 skrypt blokuje tablicę, każdy element jest konwertowany na ciąg znaków, a następnie działa jak przekazywanie tablicy właściwości, aw PSv5 wynik bloku skryptowego jest konwertowany na jeden ciąg i używany jako jedna nazwa właściwości. – TessellatingHeckler
Nie wierzę, że użycie {...} z obiektami grupowymi było technicznie poprawne ... może wyglądało to na foreach-object i where = object? O ile nie ma dokumentacji, którą ktoś ma z Grupą-Obiekt {...} –
Po drugie, wydaje się, że oświadczenie powinno być "$ dokumenty = $ dokumenty | Group-Object -Property {$ _. Ows_Title, $ _. Ows_Localisation} 'cały czas ... –