繁体   English   中英

Powershell预测了两个阵列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM