You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)"

问题根因

  1. 日志误导:Write-Host "Matching file..."写在正则匹配成功的分支里,只要文件名符合正则就会输出,但实际上只有当$filePayID在$payIDStart和$payIDEnd范围内时,才会被Where-Object保留到$totalResults中。如果你的PayID输入范围不包含200(比如输入100-199),这些文件会被过滤掉,导致计数为0,但日志仍会显示匹配信息。
  2. 正则冗余:正则表达式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:53:10