Powershell脚本仅对文件中的特定记录求和

标签 powershell

我正在尝试处理一个充满文件的目录。

我想在文件中找到特定的行, 从这些行中提取一个数值 他们将所有这些值汇总到一个目录中。

看起来像这样......

File1.txt
bread:123
ham:456
eggs:789

File2.txt
bread:999
mayo:789
eggs:123

等等……

我想找到有鸡蛋的行,提取数字,然后跨文件将这些数字加在一起。

我从其他帖子中找到了这个脚本,但它只是片段,我仍然无法理解如何使用和管道/变量/大括号。

dir . -filter "*.txt" -Recurse -name | foreach{(GC $_).Count} | measure-object -sum
#?
Get-Content | Select-String -Pattern "eggs*"
#?
$record -split ":"

我希望脚本说“eggs = 912”,即 123 + 789 = 912

最佳答案

这是一个可能的解决方案:

$pattern = 'eggs'

$sum = Get-ChildItem . -File -Recurse -Filter *.txt | 
       Get-Content | 
       Where-Object { $_ -match $pattern } |
       ForEach-Object { ($_ -split ':')[1] } |
       Measure-Object -Sum |
       ForEach-Object Sum

"$pattern = $sum"

输出:

eggs = 912
  • Get-ChildItem 递归查找所有匹配过滤器的文件
  • Get-Content 读取每个文件的每一行并将其传递到管道中
  • Where-Object 仅包含与给定 RegEx 模式匹配的行
  • ForEach-Object 行在 : 处拆分行并提取位于数组索引 [1] 处的子字符串。
  • Measure-Object 累积所有数字(如有必要,它将字符串转换为 double)。在内部,它在其 begin block 中创建一个变量,在其 process block 中累积对该变量的管道输入,并在其 end 中输出变量值> 阻止。
  • 最后 ForEach-Object 行是必要的,因为 Measure-Object 实际上输出一个具有 Sum 属性的对象,但我们只想要该属性的值,而不是整个对象。如果要删除该行,则必须编写 "$pattern = $($sum.Sum)" 来访问 Sum 属性>求和对象。

关于Powershell脚本仅对文件中的特定记录求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73080843/

相关文章:

windows - $LastExitCode=0,但 $?=False 在 PowerShell 中。将 stderr 重定向到 stdout 会给出 NativeCommandError

powershell - 在PowerShell中,每次执行脚本时,数组都会变大

.net - 在大型网络文件系统上快速设置可继承的 ACE

json - 如何将对象参数作为哈希表传递到 json arm 模板中?

powershell - 未经手动接受,无法使用注册表项远程卸载 Google Chrome

Powershell Get-Date 格式不正确

powershell - 使用Powershell为AD中的每个用户检索管理器名称

powershell - 使用PowerShell从资源管理器的收藏夹栏中添加和删除快捷方式

windows - 如何只打印 Get-ExecutionPolicy 中的 Scope 和 Policy 项?

powershell - Powershell:在命令行中调用Powershell时,如何传递变量以切换参数?