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 仅在不存在时添加到数组的主要内容,如果未能解决你的问题,请参考以下文章
我的 PowerShell 脚本仅在从 ISE 运行时才有效