Powershell仅在不存在的情况下添加到阵列

时间:2013-04-22 17:56:41

标签: arrays powershell foreach contains

在PowerShell v2中,我试图只为数组添加唯一值。我已经尝试过使用if语句,粗略地说,如果(-not $ Array -contains'TomeValue'),然后添加值,但这只是第一次有效。我已经放了一个简单的代码片段,它显示了我正在做的不起作用以及我做了什么作为一种有效的解决方法。有人可以告诉我我的问题在哪里吗?

Clear-Host
$Words = @('Hello', 'World', 'Hello')

# This will not work
$IncorrectArray = @()
ForEach ($Word in $Words)
{
    If (-not $IncorrectArray -contains $Word)
    {
        $IncorrectArray += $Word
    }
}

Write-Host ('IncorrectArray Count: ' + $IncorrectArray.Length)

# This works as expected
$CorrectArray = @()
ForEach ($Word in $Words)
{
    If ($CorrectArray -contains $Word)
    {
    }
    Else
    {
        $CorrectArray += $Word
    }
}

Write-Host ('CorrectArray Count: ' + $CorrectArray.Length)

第一种方法的结果是一个只包含一个值的数组:“Hello”。第二种方法包含两个值:“Hello”& “世界”。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

要修复代码,请尝试-notcontains或至少在parantheses中对包含测试进行WRAP。自动取款机。你的测试是:

  

如果“NOT array”(如果数组不存在)包含单词。

这没有任何意义。你想要的是:

  

如果数组不包含单词..

这是这样写的:

If (-not ($IncorrectArray -contains $Word))

-notcontains甚至更好,正如@dugas建议的那样。

答案 1 :(得分:3)

第一次,你评估-not对一个空数组,它返回true,其值为:($ true -contains'AnyNonEmptyString'),这是真的,所以它添加到数组。第二次,你评估-not对一个非空数组,它返回false,其值为:($ false -contains'AnyNonEmptyString')为false,因此它不会添加到数组中。

尝试缩小条件以查看问题:

$IncorrectArray = @()
$x = (-not $IncorrectArray) # Returns true
Write-Host "X is $x"
$x -contains 'hello' # Returns true

然后向数组中添加一个元素:

$IncorrectArray += 'hello'
$x = (-not $IncorrectArray) # Returns false
    Write-Host "X is $x"
$x -contains 'hello' # Returns false

看到问题?您当前的语法并不表达您想要的逻辑。

您可以使用notcontains运算符:

Clear-Host
$Words = @('Hello', 'World', 'Hello')

# This will work
$IncorrectArray = @()
ForEach ($Word in $Words)
{
  If ($IncorrectArray -notcontains $Word)
  {
    $IncorrectArray += $Word
  }
}