我們最近將構建服務器上的Powershell版本從4.0更新到了5.0。這一變化導致我們的一個構建腳本以意想不到的方式開始失敗。Powershell 5中的變化改變了塊花括號的含義
該代碼用於確定哪些用戶指南應該包含在我們的產品中。代碼處理一系列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 |
現在我明白了第一種語法根據文檔,因爲集團的對象預計的屬性名稱的數組是技術上不正確分組,但是在Powershell 4中,代碼確實返回了期望的結果。
現在的問題是在PowerShell中5有什麼改變,原來的代碼在PowerShell中4工作,但在PowerShell中失敗了5
如果我測試分組文件('ls | group {$ _。Length, $ _。名稱}')。看起來不像[PSv4](https://technet.microsoft.com/library/hh849907.aspx)和[PSv5](https://technet.microsoft.com/en-gb/library/hh849907)的文檔(v = wps.630).aspx)反映了任何更改。看例3和例6 - 這是一個計算屬性的有效語法。我的感覺是,在v4中,scriptblock返回一個數組,每個項目都轉換爲字符串,然後像傳遞一組屬性一樣,而在PSv5中,scriptblock的結果全部轉換爲一個字符串並用作一個屬性名稱。 – TessellatingHeckler
我不認爲使用{...}與group-object在技術上是正確的......也許它看起來像foreach-object和where = object?除非有文檔有人與Group-Object {...} –
第二個想法,它似乎聲明應該是'$ documents = $ documents | Group-Object -Property {$ _ .ows_Title,$ _ .ows_Localisation}'一直以來... –