Gần đây, chúng tôi đã cập nhật phiên bản Powershell trên các máy chủ xây dựng của chúng tôi từ 4.0 đến 5.0. Thay đổi này đã khiến một trong các kịch bản xây dựng của chúng tôi bắt đầu bị lỗi một cách bất ngờ.Thay đổi trong Powershell 5 thay đổi ý nghĩa của các dấu ngoặc nhọn khối
Mã được sử dụng để xác định hướng dẫn sử dụng nào nên được bao gồm trong sản phẩm của chúng tôi. Mã xử lý danh sách các nút xml mô tả tất cả các tài liệu có sẵn với phiên bản và văn hóa. Chúng tôi nhóm theo tiêu đề tài liệu và văn hóa và sau đó chọn phiên bản phù hợp nhất.
$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
}
Trong Powershell 4 mã này sắp xếp chính xác tài liệu theo tiêu đề và văn hóa rồi chọn phiên bản phù hợp nhất. Trong Powershell 5 mã này nhóm tất cả các tài liệu trong một danh sách duy nhất và sau đó chọn phiên bản phù hợp nhất từ danh sách đó. Do chúng tôi có tài liệu bằng nhiều ngôn ngữ, điều này có nghĩa là chỉ có ngôn ngữ có phiên bản phù hợp nhất.
Vấn đề này đã được cố định bằng cách thay đổi
$documents = $documents | Group-Object { $_.ows_Title, $_.ows_Localisation } |
để
$documents = $documents | Group-Object ows_Title, ows_Localisation |
Bây giờ tôi hiểu rằng cú pháp đầu tiên là không đúng về mặt kỹ thuật theo tài liệu do Tập đoàn-Object mong đợi một loạt các tên thuộc tính để nhóm, tuy nhiên trong Powershell 4 mã đã trả lại kết quả mong muốn.
Câu hỏi giờ đây là những gì đã thay đổi trong Powershell 5 rằng mã gốc làm việc trong Powershell 4 nhưng thất bại trong Powershell 5.
Tôi thấy như vậy nếu tôi kiểm tra các tệp nhóm ('ls | group {$ _. Length, $ _. Name} '). Không giống như tài liệu cho [PSv4] (https://technet.microsoft.com/library/hh849907.aspx) và [PSv5] (https://technet.microsoft.com/en-gb/library/hh849907 (v = wps.630) .aspx) phản ánh bất kỳ thay đổi nào. Xem ví dụ 3 và 6 - đó là cú pháp hợp lệ cho thuộc tính được tính. Cảm giác của tôi là v4 scriptblock trả về một mảng, mỗi mục được chuyển thành chuỗi và sau đó hoạt động như truyền một mảng các thuộc tính, và trong PSv5 kết quả của scriptblock được chuyển thành một chuỗi và được sử dụng như một tên thuộc tính. – TessellatingHeckler
Tôi không tin rằng việc sử dụng {...} với đối tượng nhóm đã bao giờ đúng về mặt kỹ thuật ... có lẽ nó hoạt động giống như đối tượng foreach và ở đâu = đối tượng? Trừ khi có tài liệu ai đó có với Group-Object {...} –
Trên suy nghĩ thứ hai, nó xuất hiện tuyên bố nên có được '$ tài liệu = $ tài liệu | Group-Object -Property {$ _. Ows_Title, $ _. Ows_Localisation} 'tất cả cùng ... –