变量似乎相同但不匹配

时间:2016-10-03 08:40:15

标签: arrays string powershell variables if-statement

我正在尝试比较变量中的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。

1 个答案:

答案 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"
    }
}