全部, 试图让这个工作,但没有任何运气与ps。
$a =
"install.res.1028.dll"
"install.res.1031.dll"
"install.res.1033.dll"
"install.res.1036.dll"
"install.res.1040.dll"
"install.res.1041.dll"
"install.res.1042.dll"
"install.res.2052.dll"
$b =
"install.res.1041.dll"
"install.res.1042.dll"
"install.res.2052.dll"
我只是希望有一个新的数组,其值在$ a中找不到,而在$ b中找不到,试图用write-host测试它但没有运气。 我尝试过compare-object,但我无法提取名称。我是ps的完全noob。 请提出任何建议。
foreach ($i in $a)
{ foreach-object ($b | where { {$_.name} -ne $i }) { write-host $i}}
答案 0 :(得分:2)
使用compare-object
的另一种解决方案如下:
$c = Compare-Object -ReferenceObject $a -DifferenceObject $b -PassThru
输出:
install.res.1028.dll
install.res.1031.dll
install.res.1033.dll
install.res.1036.dll
install.res.1040.dll
<强> CORRECTION:强>
以上代码适用于保证DifferenceObject是ReferenceObject的子集的情况。但是,如果DifferenceObject中还有其他对象存在于ReferenceObject中,则它将失败。上面的代码返回EITHER ReferenceObject或DifferenceObject中存在但在两者中都不存在的任何对象。
要正确返回ReferenceObject中仅在DifferenceObject中不存在的对象,需要以下代码:
Compare-Object -ReferenceObject $a -DifferenceObject $b |
Where-Object { $_.SideIndicator -eq '<=' } |
ForEach-Object { Write-Output $_.InputObject }
where-object
子句确保只有ReferenceObject中存在的对象才会传递给管道。
foreach-object
子句强制输出回一个简单的数组(参考:Converting Custom Object arrays to String arrays in Powershell - 谢谢Keith)
答案 1 :(得分:1)
$c = $a | Where-Object { $b -notcontains $_ }
这应该可以胜任。
Where-Object
的代码块测试通过管道输入的数组的每个元素。该块应该返回一个布尔值,如果它是真的,那么调用的结果将包含有问题的项。
因此,对于条件,我们将-notcontains
运算符与第二个数组一起使用。 $_
是指$a
中的单个项目。
这不需要额外的或嵌套的循环。