我对以下情况感到满意:
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
循环的末尾?!
答案 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])"
}
}