我们最近将构建服务器上的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}'一直以来... –