我有一个脚本,可以在成千上万的服务器上运行,该脚本从日志中编译关键字并输出它们在文本文件中出现的次数。我使用xcopy将日志直接插入到我的盒子中,然后将它们全部放入同一文件夹中。 (IE:在C:\ scripts \中包含server1_results.txt,server2_results.txt等)对于每个单独的服务器,输出如下所示:
---------- C:\TEMP\TEXT.001: 0
---------- C:\TEMP\TEXT.002: 0
---------- C:\TEMP\TEXT.003: 2
---------- C:\TEMP\TEXT.004: 0
---------- C:\TEMP\TEXT.005: 1
冒号后的数字是关键字在日志中出现的次数。然后,我使用批处理脚本解析出最终编号之前的所有内容,然后将总数相加,然后将结果导出到新的文本文件中。
我的方法工作正常,但是,我有数百个日志,而我的脚本只能在一个日志上工作-一次一个。
我一直在使用Get-Content,但是没有找到想要的结果。
因此,我需要一个脚本,该脚本将循环并解析每个文件,并找到每个文件的总和(server1将具有自己的结果,server2将具有自己的结果)。如果脚本将文件名添加到结果中,这也将很有帮助。我正在寻找的结果:
server1_results.txt : 22
答案 0 :(得分:1)
这对我有用
$Files = (Get-ChildItem c:\scripts\*.txt).FullName
$count=0
foreach ($File in $Files)
{
$thisCount = Get-Content $File
$Count = $Count + $thisCount
}
"Total Count is: $Count"
答案 1 :(得分:0)
我相信这会满足您的要求:
foreach ($file in (Get-ChildItem "C:\scripts\*_results.txt")) {
$Sum = 0
switch -regex -file $file
{
"[1-9]\d*$" {$sum += $matches[0] -as [int]}
}
"{0} : {1}" -f $file.name,$sum
}
您有绩效目标吗?
答案 2 :(得分:0)
与我的批处理答案非常相似的powershell脚本
Parsing multiple text files with alternate file names, finding sum, and then compiling output with Batch file
## Q:\Test\2019\04\02\SO_55475471.ps1
$Folder = 'X:\path\to\files'
$HashTable = @{}
foreach ($File in (Get-ChildItem -Path $Folder -Filter *_count.txt -File)){
Select-String -Path $File -Pattern '(?<=-{5,}.*)\d+$' | ForEach-Object {
$HashTable[$File.BaseName]+= [int]$_.Matches[0].Value
}
}
$HashTable
示例输出:
> Q:\Test\2019\04\02\SO_55475471.ps1
Name Value
---- -----
server1_count 3
server2_count 15
PS:只需更改*_count.txt
=> *_results.txt
要获取一些统计信息:
> $HashTable.GetEnumerator()|Measure-Object Value -sum -ave -min -max
Count : 2
Average : 9
Sum : 18
Maximum : 15
Minimum : 3
Property : Value