PowerShell脚本用Measure-Object无法求和仅输出单个数值问题
PowerShell脚本求和问题:无法计算整体总和
脚本原本要读取int格式数值,显示单个值并计算总和,但当前执行时,Measure-Object仅输出每个单独数值,无法得到所有值的总和。
原脚本代码
$path = "C:\Users\***\Desktop\Projet Script\***\stat.dat_20220901_235900" $CharArray = Get-Content -Path $path $CharArray = $CharArray.Split(".") $a = $($CharArray) $Value = "****" foreach ($c in $a) { if ($c -match $Value) { $d = $c.Split(",") $e = $d[6] $e = $e.replace('"', '') [int32[]]$f = $e $g = ($f | Measure-Object -Sum).Sum $g } }
当前输出
20567310 4703774 14998840 3068932 22083 672967 309701 7549299
目标文件内容示例
"1","O","I","220831 235847","E","0","219413795","az","aaaa","az","p:\logiciels\az\az\run_time\tmp\","F2461724". "1","I","R","220831 235903","E","0","87958407","PHSE","BIA_PROD2","az","p:\logiciels\axway\gateway\run_time\tmp","F2461728". "1","O","I","220831 235859","E","0","157494179","az","az","az","p:\logiciels\az\az\run_time\tmp\","F2461726". "1","O","I","220831 235905","E","0","87958407","PHSE","az","**","p:\logiciels\az\az\run_time\tmp\","F2461728"
解决方案
问题根源是原脚本在循环内对单个值执行求和(结果就是值本身),没有收集所有值再统一计算总和。修改后的脚本会先收集所有符合条件的数值,最后输出总和:
$path = "C:\Users\***\Desktop\Projet Script\***\stat.dat_20220901_235900" $CharArray = Get-Content -Path $path $CharArray = $CharArray.Split(".") $a = $CharArray $Value = "****" # 初始化数组存储所有符合条件的数值 $allValues = @() foreach ($c in $a) { if ($c -match $Value) { $d = $c.Split(",") $e = $d[6] $e = $e.replace('"', '') # 安全转换为int32,避免转换失败报错 if ([int32]::TryParse($e, [ref]$parsedNum)) { $allValues += $parsedNum # 输出单个数值 $parsedNum } } } # 计算并输出所有数值的总和 Write-Host "`n所有数值总和: " ($allValues | Measure-Object -Sum).Sum
关键修改点
- 新增
$allValues数组,用于收集所有提取到的有效int数值 - 使用
[int32]::TryParse做类型转换,避免因无效值导致脚本中断 - 循环内输出单个值,最后统一计算并输出整体总和
内容的提问来源于stack exchange,提问作者oussama_tr
相关产品推荐
相关产品推荐

