[英]Powershell foreach over two arrays
所有,试图让这个工作,但没有任何运气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}}
使用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
更正:
上面的代码适用于保证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
子句强制输出回到一个简单的数组(参考: 将自定义对象数组转换为Powershell中的String数组 - 感谢Keith)
$c = $a | Where-Object { $b -notcontains $_ }
这应该做的工作。
Where-Object
的代码块测试管道中的每个元素。 该块应该返回一个布尔值,如果它是真的,那么调用的结果将包含有问题的项。
因此对于条件,我们将-notcontains
运算符与第二个数组一起使用。 $_
是指$a
的单个项目。
这不需要额外的或嵌套的循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.