gpt4 book ai didi

powershell - Powershell 5 中的哪些变化改变了 block 大括号的含义

转载 作者:行者123 更新时间:2023-12-03 23:54:47 30 4
gpt4 key购买 nike

我们最近将构建服务器上的 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 中失败。

最佳答案

看起来 Group-Object cmdlet 的语法没有改变,因为下面显示了两个版本的相同定义(以及定义方法的 DLL):

gcm Group-Object | fl DLL,Definition


DLL : C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.PowerShell.Commands.Utility\v4.0_
3.0.0.0__31bf3856ad364e35\Microsoft.PowerShell.Commands.Utility.dll
Definition :
Group-Object [[-Property] <Object[]>] [-NoElement] [-AsHashTable] [-AsString]
[-InputObject <psobject>] [-Culture <string>] [-CaseSensitive] [<CommonParameters>]

但正如 PetSerAL 在评论中提到的那样,5.0 DLL 处理数组的方式与 4.0 不同。例如:
$a=[PSCustomObject]@{item=@(1,2)}   #Object with an array for the value of the item property
$b=[PSCustomObject]@{item=@(3,3)} #Object with a different array for the value of the item property
$a.item.Equals($b.item) #This deep compare is false, as the two objects are not equal
$a.item.GetType().Equals($b.item.GetType()) #This "shallow" compare is true because both are the array type.
$c=[PSCustomObject]@{item=@{key='value'}} #Similar but this time the item value is a hashtable
$d=[PSCustomObject]@{item=@{anotherkey='anothervalue'}} #again comparing the two items we expect the result to be false if deep compared but true if shallow compared
$e=[PSCustomObject]@{item=get-date} #another test using two datetimes (another common "reference" type)
$f=[PSCustomObject]@{item=[datetime]::MinValue}
$a,$b,$c,$d,$e,$f | group -Property item #now we see what happens when using group-object

#Output in PowerShell 4.0
Count Name Group
----- ---- -----
1 {1, 2} {@{item=System.Object[]}}
1 {3, 3} {@{item=System.Object[]}}
2 {System.Collections.Di... {@{item=System.Collections.Hashtable}, @{item=System.Collections...
1 8/5/2016 9:45:36 PM {@{item=8/5/2016 9:45:36 PM}}
1 1/1/0001 12:00:00 AM {@{item=1/1/0001 12:00:00 AM}}

#Output in PowerShell 5.0
Count Name Group
----- ---- -----
2 {1, 2} {@{item=System.Object[]}, @{item=System.Object[]}}
2 {System.Collections.Di... {@{item=System.Collections.Hashtable}, @{item=System.Collections...
1 8/5/2016 9:45:40 PM {@{item=8/5/2016 9:45:40 PM}}
1 1/1/0001 12:00:00 AM {@{item=1/1/0001 12:00:00 AM}}

请注意,在版本 4 中,数组值被视为单独的组,但哈希表被视为相等的组。这意味着数组进行了深度比较,但哈希表是浅比较(所有哈希表都被视为等效)

现在在第 5 版中,数组被视为等价的,这意味着它们是类似于哈希表工作方式的浅比较。

如果您想查看完整的详细信息,您需要使用 ilspy 或 .Net Reflector 来反汇编 DLL 并比较 Microsoft.PowerShell.Commands.GroupObjectCommand 类的 DoGrouping 方法。很难说它是否是一个错误,但它绝对是 group-object cmdlet 的一个重大更改。

更新:我玩得越多,我就越认为新代码是正确的(除了显示的名称应该是 System.Object)并且旧代码中存在错误。看起来 v4 正在做某种基于字符串的比较,因为即使是具有相同元素的两个不同数组也会组合在一起,即使 $a.Equals([PSCustomObject]@{item=@(1,2)})始终为 false(它们的 GetHashCode 方法结果不匹配)。我可以让 5.0 对类似数组进行分组的唯一方法是使用 group -Property {$_.item -join ','} , 匹配 4.0 输出,除了名称是 1,2 而不是 {1, 2}。此外,如果您想使用哈希表项的键进行分组,您可以使用 group -Property {$_.item.somekey} (假设它们都具有某个键的值)

关于powershell - Powershell 5 中的哪些变化改变了 block 大括号的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38600414/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com