PowerShell中While循环-and条件不符合预期的问题求助
PowerShell循环逻辑修正建议
当前的While循环条件($CurrLine1 -lt $LastLine1) -and ($CurrLine2 -lt $LastLine2)会导致只要任意一个数组遍历到结尾,循环就立即停止,这和你期望的“两个数组都遍历完才停止”不符。比如当$CurrLine2 -eq $LastLine2时,即使$CurrLine1还没到结尾,循环也会终止,导致In1的剩余内容未处理。
修正循环条件
将循环条件改为只要任意一个数组还有未遍历的元素,就继续循环,以下两种写法等价:
- 使用
-or逻辑(更直观):
While (($CurrLine1 -lt $LastLine1) -or ($CurrLine2 -lt $LastLine2))
- 直接表达“未同时遍历完两个数组”:
While (-not (($CurrLine1 -eq $LastLine1) -and ($CurrLine2 -eq $LastLine2)))
补充边界处理逻辑
修改循环条件后,必须在循环内部处理其中一个数组已遍历完的情况,避免索引越界,同时确保剩余元素被正确写入$Out1:
While (($CurrLine1 -lt $LastLine1) -or ($CurrLine2 -lt $LastLine2)) { # 若In1已遍历完,直接写入In2剩余元素 if ($CurrLine1 -ge $LastLine1) { $Out1[$CurrLine3] = $In2[$CurrLine2] $CurrLine2++ $CurrLine3++ continue } # 若In2已遍历完,直接写入In1剩余元素 if ($CurrLine2 -ge $LastLine2) { $Out1[$CurrLine3] = $In1[$CurrLine1] $CurrLine1++ $CurrLine3++ continue } # 原有的字符串对比逻辑(仅当两个数组均有未遍历元素时执行) $in1Str = $In1[$CurrLine1] $in2Str = $In2[$CurrLine2] # 简化原Substring调用:截取0到字符串长度的子串等价于原字符串 if ($in1Str -eq $in2Str.Substring(0, $in1Str.Length)) { # Merge data from $In2 into $Out1 $Out1[$CurrLine3] = $In2[$CurrLine2] $CurrLine1++ $CurrLine2++ } elseif ($in1Str -lt $in2Str.Substring(0, $in1Str.Length)) { # Insert new record from In1 into Out1 $Out1[$CurrLine3] = $In1[$CurrLine1] $CurrLine1++ } else { # Drop record from In2 as presumably film deleted $CurrLine2++ } $CurrLine3++ # 确保每次写入后索引递增,避免覆盖数据 }
额外优化说明
- 原代码中
($In1[$CurrLine1]).Substring(0, ($In1[$CurrLine1]).Length)完全等价于直接使用$In1[$CurrLine1],可直接简化,减少不必要的字符串操作。 - 原代码未对
$CurrLine3进行递增操作,会导致$Out1始终覆盖同一索引位置的内容,必须在每次写入元素后递增该索引。
内容的提问来源于stack exchange,提问作者HotStuff669
相关产品推荐
相关产品推荐

