PowerShell中IF条件判断未按预期触发,求排查解决
问题分析与解决方案
核心问题原因
你的判断条件无法触发的根本原因是循环变量j的含义和分卷编号不匹配:
for循环中j是数组AllRarfiles的索引,从1开始遍历(跳过了索引0的part1.rar)。- 但你用
$j作为分卷编号拼接字符串,比如j=1时,拼接出的是Factory_Selection_2.part1.rar,而此时NextRar是数组索引1对应的Factory_Selection_2.part2.rar,两者自然不匹配;当j=2时,拼接出part2,但NextRar是索引2的part3,以此类推,永远无法命中。
另外,TrimEnd(".part1.rar")的写法存在隐患:它是按字符集合移除末尾字符,而非精确匹配字符串,比如如果文件名是Factory_Selection_2.rar.part1.rar,会错误地截断成Factory_Selection_2,建议改用精确替换。
修复方案
方案1:使用正则表达式匹配同组分卷(推荐)
正则表达式可以更可靠地匹配所有同前缀的分卷文件,且不受数组顺序影响:
if($CurrentRar.Contains(".part1.rar")){ [void] $RarGroup.Add($CurrentRar) # 改用-replace精确移除末尾的.part1.rar $CurrentRarBase = $CurrentRar -replace '\.part1\.rar$', '' foreach ($file in $AllRarfiles) { $NextRar = $file.Name # 跳过已经添加的part1文件 if ($NextRar -eq $CurrentRar) { continue } # 正则匹配同组的partN.rar(N≥2) if ($NextRar -match "^$([regex]::Escape($CurrentRarBase))\.part(\d+)\.rar$") { $partNumber = [int]$matches[1] if ($partNumber -gt 1) { Write-Host "Test Hit" -ForegroundColor Green [void] $RarGroup.Add($NextRar) } } } $RarGroups.Add($RarGroup) }
方案2:修正循环变量与分卷编号的对应关系
如果坚持使用原循环逻辑,需要将分卷编号改为$j+1(因为索引j对应的分卷号是j+1):
if($CurrentRar.Contains(".part1.rar")){ [void] $RarGroup.Add($CurrentRar) $CurrentRarBase = $CurrentRar -replace '\.part1\.rar$', '' for ($j = 1; $j -lt $AllRarfiles.Count; $j++){ $NextRar = $AllRarfiles[$j].Name # 分卷编号是j+1,而非j if($NextRar.Contains("$CurrentRarBase.part$($j+1).rar")){ Write-Host "Test Hit" -ForegroundColor Green [void] $RarGroup.Add($NextRar) } } $RarGroups.Add($RarGroup) }
注意:此方案依赖AllRarfiles数组严格按分卷编号排序,否则会匹配错误。
内容的提问来源于stack exchange,提问作者fmotion1
相关产品推荐
相关产品推荐

