【问题标题】:foreach loop mixes up resultforeach 循环混淆了结果
【发布时间】:2017-02-21 14:42:33
【问题描述】:

我正在为以下情况苦苦挣扎:

testfile.txt

1个
2 乙
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 是 3
b 是 1
c 是 2

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

a 是 1
b 是 2
c 是 3

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

【问题讨论】:

  • $output = "$var1 is $var2" 移动到 Write-Host 之前,因为它不是模板,而是使用先前值的立即扩展替换。
  • 当然可以。但是真的有必要把它放在每个 if 语句中吗?
  • 或者您可以将每个 Write-Host 更改为 Write-Host "$var1 is $var2"
  • 其实你的整个代码可以写成(Get-Content "C:\Scripts\testfile.txt") -replace '(\S+)\s+(\S+)', '$1 is $2'如果你想要模板,使用script block method
  • 是的,这只是我原始脚本的一个简化示例。我会像你展示的那样解决它。谢谢大家!

标签: powershell variables foreach


【解决方案1】:

你可能之前运行过代码,因为通常你的输出应该是这样的:

是
b 是 1
c 是 2

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

这种行为的原因是您仅在将"$var1 is $var2" 分配给变量之后将值分配给$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])"
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2016-06-16
    相关资源
    最近更新 更多