管道中单个变量的多个语句

时间:2017-08-22 20:02:52

标签: powershell

我确定在某个地方以前已经回答了这个问题,但是尽管让自己发疯了我似乎无法找到它。对Powershell和编码总体而言,任何批评都欢迎。

我想查看一系列日志并输出日志名称,后跟字符串被找到的次数或包含某个字符串的行数。要么应该工作。

我现在所拥有的是以下内容

$logsToCheck = "F:\errlog1.txt",
                "F:\errlog2.txt"
$errMatches = foreach($log in $logsToCheck)
     {Write-Host $log; Select-String -Path $log -Pattern "ERRORBAD"}
$errMatches

我的目标就是输出日志名称和错误数量,例如:

F:\errlog1.txt
12
F:\errlog2.txt
7

我想过为我的循环中的每个日志创建变量并打印路径名,然后是

$countErrLog1 = Select-String -Path F:\errlog1.txt -Pattern "ERRORBAD"
$countErrLog1.Matches.Count

但这似乎相当多余。

所以我最终要找的是如何将多个语句传递给管道中的单个变量,然后再转到管道中的下一个变量。

提前致谢。

2 个答案:

答案 0 :(得分:1)

Select-StringGroup-Object非常容易。

$logsToCheck = "F:\errlog1.txt",
                "F:\errlog2.txt"
Select-String -Path $logsToCheck -Pattern 'ERRORBAD' | 
    Group Path | 
    Select Count,Name

这将输出如下内容:

Count Name
----- ----
   12 F:\errlog1.txt
    7 F:\errlog2.txt

答案 1 :(得分:0)

你实际上已经非常接近了。需要考虑的是Count如果为零则返回NOTHING,因此您需要使用@()强制PowerShell为您提供数组。

以下是我使用的代码:

$logsToCheck = "test.txt","test2.txt"
foreach($log in $logsToCheck)
{
    $matchInfo = @(Select-String -Path $log -Pattern "ERROR")

    Write-Host $log $matchInfo.Count
}

的test.txt:

ERROR
GOOD
GOOD
ERROR
ERROR

text2.txt

GOOD
GOOD
GOOD
GOOD
GOOD

我的结果:

test.txt 3
test2.txt 0