Powershell 仅在不存在时添加到数组

Posted

技术标签:

【中文标题】Powershell 仅在不存在时添加到数组【英文标题】:Powershell Only Add to Array if it doesn't exist 【发布时间】:2013-04-15 17:43:34 【问题描述】:

在 PowerShell v2 中,我尝试仅向数组添加唯一值。我尝试过使用 if 语句,粗略地说,如果(-not $Array -contains 'SomeValue'),然后添加该值,但这仅在第一次有效。我放了一个简单的代码 sn-p,它显示了我正在做的事情是行不通的,以及我所做的事情是一种行之有效的解决方法。有人可以告诉我我的问题在哪里吗?

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”和“World”。非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

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

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

$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
  

【讨论】:

【参考方案2】:

要修复您的代码,请尝试 -notcontains 或至少将您的 contains-test 包装在括号中。自动取款机。您的测试内容如下:

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

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

如果数组不包含单词..

是这样写的:

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

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

【讨论】:

以上是关于Powershell 仅在不存在时添加到数组的主要内容,如果未能解决你的问题,请参考以下文章

Gremlin - 仅在不存在时添加顶点

仅在不存在时将脚本添加到头部

sql 仅在不存在时添加索引

我的 PowerShell 脚本仅在从 ISE 运行时才有效

Fluent NHibernate - 仅在不存在时创建数据库模式

Oracle - 仅在不存在时创建索引