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

Lla*_*slo 7 arrays powershell foreach contains

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

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)
Run Code Online (Sandbox Code Playgroud)

第一种方法的结果是一个只包含一个值的数组:"Hello".第二个方法包含两个值:"Hello"和"World".任何帮助是极大的赞赏.

Fro*_* F. 8

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

如果"NOT array"(如果数组不存在)包含单词.

这毫无意义.你想要的是:

如果数组不包含单词..

这是这样写的:

If (-not ($IncorrectArray -contains $Word))
Run Code Online (Sandbox Code Playgroud)

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


dug*_*gas 7

第一次,您针对空数组评估 -not,该数组返回 true,其计算结果为: ($true -contains 'AnyNonEmptyString') 为 true,因此它将添加到数组中。第二次,您针对非空数组评估 -not,该数组返回 false,其计算结果为: ($false -contains 'AnyNonEmptyString') 为 false,因此它不会添加到数组中。

尝试分解您的条件以查看问题:

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

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

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

看到问题了吗?您当前的语法没有表达您想要的逻辑。

您可以使用 notcontains 运算符:

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

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