PowerShell中$totalResults.Count返回0问题求助
问题:匹配文件后$totalResults计数为0的排查与解决
问题现象
控制台能输出匹配的文件信息,但$totalResults.Count显示为0,日志如下:
Found file: payment1_200.txt Found file: payment_200.txt Matching file: payment1_200.txt with Pay ID: 200 Matching file: payment_200.txt with Pay ID: 200 Total matching results: 0
原代码
$payIDRange = $textBoxPayID.Text $payIDParts = $payIDRange -split "-" $payIDStart = [int]$payIDParts[0] $payIDEnd = [int]$payIDParts[1] $allFiles = Get-ChildItem -Path "C:\Files\$region" foreach ($file in $allFiles) { Write-Host "Found file: $($file.Name)" } $totalResults = @($allFiles | Where-Object { if ($_.Name -match "payment.*_(\d+)\.txt(\.txt)?$") { $filePayID = [int]$matches[1] Write-Host "Matching file: $($_.Name) with Pay ID: $filePayID" return ($filePayID -ge $payIDStart -and $filePayID -le $payIDEnd) } return $false }) Write-Host "Total matching results: $($totalResults.Count)"
问题根因
- 日志误导:
Write-Host "Matching file..."写在正则匹配成功的分支里,只要文件名符合正则就会输出,但实际上只有当$filePayID在$payIDStart和$payIDEnd范围内时,才会被Where-Object保留到$totalResults中。如果你的PayID输入范围不包含200(比如输入100-199),这些文件会被过滤掉,导致计数为0,但日志仍会显示匹配信息。 - 正则冗余:正则表达式
payment.*_(\d+)\.txt(\.txt)?$允许匹配.txt.txt结尾的文件,和实际的.txt结尾文件匹配逻辑有冗余,可能引发不必要的判断。
修复方案
方案1:验证PayID范围的正确性
在代码中添加日志,确认$payIDStart和$payIDEnd的实际值:
$payIDRange = $textBoxPayID.Text $payIDParts = $payIDRange -split "-" $payIDStart = [int]$payIDParts[0] $payIDEnd = [int]$payIDParts[1] # 添加日志确认范围 Write-Host "当前PayID范围:$payIDStart 至 $payIDEnd"
如果范围不包含匹配到的200,调整输入的PayID范围即可解决。
方案2:修正正则并优化日志输出
简化正则表达式,仅在文件符合PayID范围时输出匹配日志:
$payIDRange = $textBoxPayID.Text $payIDParts = $payIDRange -split "-" $payIDStart = [int]$payIDParts[0] $payIDEnd = [int]$payIDParts[1] Write-Host "当前PayID范围:$payIDStart 至 $payIDEnd" $allFiles = Get-ChildItem -Path "C:\Files\$region" foreach ($file in $allFiles) { Write-Host "Found file: $($file.Name)" } $totalResults = @($allFiles | Where-Object { if ($_.Name -match "^payment.*_(\d+)\.txt$") { $filePayID = [int]$matches[1] # 仅符合范围时输出日志并保留文件 if ($filePayID -ge $payIDStart -and $filePayID -le $payIDEnd) { Write-Host "Matching file: $($_.Name) with Pay ID: $filePayID" return $true } } return $false }) Write-Host "Total matching results: $($totalResults.Count)"
方案3:处理输入异常(可选)
如果用户输入的PayID格式不正确(比如没有-),会导致转换失败,可添加异常处理:
$payIDRange = $textBoxPayID.Text if ($payIDRange -notmatch "^(\d+)-(\d+)$") { Write-Host "PayID范围格式错误,请输入类似100-200的格式" return } $payIDStart = [int]$matches[1] $payIDEnd = [int]$matches[2]
内容的提问来源于stack exchange,提问作者k5927211
相关产品推荐
相关产品推荐

