如何用PowerShell脚本汇总目录下文件中eggs行的数值总和?
批量提取文件中eggs行的数值并求和
直接给你能用的完整PowerShell脚本,执行后就能输出目标结果:
$total = 0 # 递归遍历当前目录下所有txt文件 Get-ChildItem -Path . -Filter "*.txt" -Recurse | ForEach-Object { # 读取当前文件内容,筛选出含"eggs:"的行 Get-Content $_.FullName | Select-String "eggs:" | ForEach-Object { # 按冒号拆分行,提取数值部分并转成整数,累加到总和 $value = ($_.Line -split ":")[1] -as [int] $total += $value } } # 输出最终结果 Write-Host "eggs = $total"
关键部分拆解(对应你找到的脚本片段解释):
- 遍历文件:
Get-ChildItem -Path . -Filter "*.txt" -Recurse替代你原来的dir命令,它会返回带完整路径的文件对象,避免子目录文件找不到的问题。管道|把每个文件传给后面的ForEach-Object,大括号{}里就是对单个文件的处理逻辑。 - 匹配目标行:
Get-Content $_.FullName | Select-String "eggs:",Get-Content读取文件内容,Select-String精准匹配带eggs:的行(用eggs:比eggs*更稳妥,不会误匹配类似eggshell的无关内容)。 - 提取数值:
($_.Line -split ":")[1]就是你用的-split ":"逻辑,$_.Line是Select-String匹配到的整行内容,拆分后取第二个元素就是数值,-as [int]把字符串转成整数,防止变成字符串拼接。 - 求和输出:用
$total变量累加所有数值,最后用Write-Host输出指定格式的结果。
你原有片段的问题说明:
dir . -filter "*.txt" -Recurse -name | foreach{(GC $_).Count} | measure-object -sum:这个是统计所有txt文件的总行数总和,和你的需求无关,我们需要的是提取特定行的数值,所以要替换成读取内容匹配目标行的逻辑。Get-Content | Select-String -Pattern "eggs*":缺少指定文件路径,而且eggs*的正则表达式会匹配egg、eggs等变体,应该用eggs:精准匹配行中的标识。$record -split ":":这个拆分逻辑是对的,但需要先拿到Select-String匹配到的行对象(即$_.Line),再执行拆分操作。
内容的提问来源于stack exchange,提问作者The_BMan
相关产品推荐
相关产品推荐

