我对Powershell很新,但有问题。
我似乎无法使用Compare-Object
和Sort-Object
功能。
我有两个Arraylists,我填写了10个"表"
#Create Arraylists
$list1 = new-object System.Collections.ArrayList
$list2 = new-object System.Collections.ArrayList
#Declare Table-Class
class Table {
[String] $name
[Int] $number
}
#Fill list1
[Int] $i = 0
while ($i -lt 10) {
$entry = new-Object Table
$entry.name = "Name";
$entry.number = $i;
$list1.Add($entry)
$i++
}
#Fill list2
[Int] $j = 10
while ($j -gt 0) {
$entry = new-Object Table
$entry.name = "name";
$entry.number = $j;
$list2.Add($entry)
$j--
}
现在我想像这样比较这两个ArrayLists:
Compare-Object $list1 $list2 | ForEach-Object {$_.InputObject}
这似乎不起作用,我认为这是因为我并没有真正做任何比较。如果有人能用正确的语法帮助我,我真的很开心。
无论如何,我认为这种比较会以某种方式返回$false
布尔值。
如果确实如此,我想按$list2
对$entry.number
进行排序。
我是这样尝试的:
$list2 = $list2 | Sort-Object -Property { $_[1] }
但我的名单根本没有变化。我已经尝试了几种不同的解决方案"但似乎这些都不是真正的解决方案"。
如果有人可以帮助我,或者至少指出我正确的方向,我真的很高兴。
编辑:对于未来的读者,这是工作语法:
#sort list by the property number
$list2 = $list2 | sort-object -Property number
#count differences and if differences greater than 0, do stuff
[Int] $diff
$properties = $list1 | Get-Member -MemberType Property | Select-Object -ExpandProperty Name
foreach ($property in $properties) {
$diff = 0
$diff = (Compare-Object $list1 $list2 -Property "$property").count
if ($diff -ne 0) {
#do stuff
}
else {
#do something else
}
}
答案 0 :(得分:1)
您的排序不起作用,因为-Property
希望您传递实际属性的名称。在您的情况下,第二类属性:$name
和$number
。您还可以使用$list2 | Get-Member
检查对象具有哪些属性。因此,为了排序,您可以使用:
$list2 = $list2 | Sort-Object -Property number
现在Compare-Object
无效的原因是因为它的实现方式与人们预期的不同。请参阅this answer解释其工作原理。
您应该记住另一件事:调用$list2.Add($entry)
实际上返回一个整数(插入元素的索引)。 PowerShell返回所有未捕获的输出。如果您不小心,这可能会导致一些意外的行为/输出。所以你应该养成写[void] $list2.Add($entry)
的习惯,除非你真的想要返回那些索引。