foreach循环混合结果

时间:2017-02-21 14:42:34

标签: powershell variables foreach

我对以下情况感到满意:

TESTFILE.TXT

1 a
2 b
3 c

脚本:

$input = Get-Content "C:\Scripts\testfile.txt"

foreach ($line in $input) {
    $var1 = $line.Substring(2,1)
    $output = "$var1 is $var2"

    if ($line -match "1") {
        $var2 = "1"
        Write-Host $output
    } elseif ($line -match "2") {
        $var2 = "2"
        Write-Host $output
    } elseif ($line -match "3") {
        $var2 = "3"
        Write-Host $output
    } else {}
}

结果:

a is 3
b is 1
c is 2

为什么结果混淆了?它应该是:

a is 1
b is 2
c is 3

即使我将$output放在foreach循环的末尾?!

1 个答案:

答案 0 :(得分:4)

您之前可能已经运行过代码,因为通常您的输出应该如下所示:

a is
b is 1
c is 2

第一个输出行中的3显然是从之前的尝试中保留的。

此行为的原因是,只有在将$var2分配给变量后才能为"$var1 is $var2" 分配值。字符串中的变量在赋值时已经扩展,因此您从前一次迭代中获得$var2的值(或第一次运行时的空值)。

要获得您想要的输出,请将代码更改为:

foreach ($line in $input) {
    $var1 = $line.Substring(2,1)
    $output = "$var1 is {0}"

    if ($line -match '1') {
        Write-Host ($output -f '1')
    } elseif ($line -match '2') {
        Write-Host ($output -f '2')
    } elseif ($line -match '3') {
        Write-Host ($output -f '3')
    }
}

或者像这样:

foreach ($line in $input) {
    $var1 = $line.Substring(2,1)

    $var2 = if ($line -match '1') {
        '1'
    } elseif ($line -match '2') {
        '2'
    } elseif ($line -match '3') {
        '3'
    }

    if ($var2) {
        Write-Host "$var1 is $var2"
    }
}

更好的是,既然您仍然使用正则表达式匹配,请执行以下操作:

foreach ($line in $input) {
    $var1 = $line.Substring(2,1)

    if ($line -match '[1-3]') {
        Write-Host "$var1 is $($matches[0])"
    }
}