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

Powershell 管道中单个变量上的多个语句,powershell,Powershell,我确信在某种程度上,这个问题以前已经得到了回答,但尽管让我自己发疯了,我似乎找不到它。对于Powershell和一般的编码来说,任何批评都是受欢迎的 我想查看一系列日志,并输出日志名称,后跟找到字符串的次数或包含特定字符串的行数。两者都应该有效 我现在有以下几点 $logsToCheck = "F:\errlog1.txt", "F:\errlog2.txt" $errMatches = foreach($log in $logsToCheck) {Wr

我确信在某种程度上,这个问题以前已经得到了回答,但尽管让我自己发疯了,我似乎找不到它。对于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
但这似乎是多余的

因此,我最终要寻找的是如何在进入管道中的下一个变量之前,将多个语句传递给管道中的单个变量

提前感谢。

使用选择字符串和组对象非常简单

这将输出如下内容:

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

实际上你已经很接近了。要考虑的是,如果计数为零,计数就不会返回任何东西,所以你需要使用@强制PultS壳给你一个数组。 以下是我使用的代码:

$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

正在运行哪个版本的PowerShell?您可以使用$PSVersionTable.PSVersion.ToString获得它。您甚至不知道这个命令。给我我想要的输出,效果很好,但是你只使用了Group而不是Group对象。它们都给我相同的输出,但似乎不一样,或者它们是?确保我明白,他们是同一个命令。Group只是Group Objects的一个较短的别名这也很有效,虽然它不像其他答案那样格式化,但我仍计划在将来使用它。让我对如何读取代码有了更好的了解。
test.txt 3
test2.txt 0