我正在尝试比较变量中的2个值以查看它们是否相同,在PowerShell输出中我可以看到某些组合应该是真的!
首先,如果没有$vergelijking1
和$vergelijking2
,则表明$nummersPOs[$counter]
和$object.'col1'
相同,但if语句永远不会为真。
我唯一能想到它失败的原因是其中一个变量来自一个数组。当我将两种类型都改为String时,我确实可以看到有一些隐藏的文字,但我不明白为什么我的if语句现在永远不会是真的。它写了" test2"但是应该在循环中写下#34;。
[System.Collections.ArrayList]$data = Import-Csv "C:\Users\UserName\Documents\test.csv"
[System.Collections.ArrayList]$NummersPOs = Import-Csv "C:\Users\UserName\Documents\test.csv" | select "col1" -Unique
$counter = 0
foreach ($object in $NummersPOs) {
$newCSV = New-Object System.Collections.ArrayList
foreach ($object in $data) {
if ($object."col2") {
$index = $newCSV.Add($object)
[string]$vergelijking1 = $NummersPOs[$counter]
#$vergelijking1 = $vergelijking1 -replace '\D+(\d+)','$1'
$vergelijking1
[string]$vergelijking2 = $object.'col1'
$vergelijking2
if ($vergelijking1 -contains $vergelijking2) {
Write-Host "inside the loop"
} else {
Write-Host "test2"
}
}
}
$counter++
}
$newCSV | Export-Csv "C:\Users\UserName\Documents\test2.csv"
示例输出:
@{col1=632424} 632424 test2 @{col1=632424} 632446 test2
正如你所看到的,第一个应该是真的。 -contain
或-like
都会给出错误的BTW。
答案 0 :(得分:0)
实际查看您的操作数:
"@{col1=632424}" ← $vergelijking1 "632424" ← $vergelijking2
这两个字符串显然不相等,那你为什么期望它们呢?
您正在将对象分配给$verglijking1
并将其强制转换为字符串,因此您实际上会获得该对象的字符串表示形式(@{col1=632424}
)。要$verglijking2
,请指定对象属性的值($object.'col1'
)。即使您仍然将值转换为字符串,您只能获得值的字符串表示形式,而不是对象的字符串表示形式。
此外,您不能像-contains
operator那样使用@Mathias R. Jesson,因为该运算符用于检查数组中元素的存在。 -like
运算符会有效,但您必须在值("*$verglijking2*"
)之前和之后放置wildcards。如果没有通配符,则运算符的行为与-eq
运算符完全相同。
话虽如此,你在剧本中所做的所有演员都是完全没必要的。以相同的方式处理两个变量并使用正确的比较运算符,问题将消失。
if ($object.col2) {
$vergelijking1 = $NummersPOs[$counter].col1
$vergelijking2 = $object.col1
if ($vergelijking1 -eq $vergelijking2) {
Write-Host "inside the loop"
} else {
Write-Host "test2"
}
}