使用 PowerShell,我需要从目录中的每个(文本)文件中获取匹配项的第一个实例。
文件的相关部分如下所示:
TANK PRODUCT VOLUME TC-VOLUME ULLAGE HEIGHT WATER TEMP
1 无铅 2275 0 7606 34.83 0.00 70.12
在文件的更下方,有更多“无铅”一词的实例,但我需要从这一行获取音量(在本例中为 2275)。
这个脚本: $u_line = (Select-String -Path ".\TMUSite_*.sav" -Pattern "Unleaded" | Select-Object * -First 1).Line 让我: 1 无铅 2275 0 7606 34.83 0.00 70.12
...这很好,因为我可以使用 [regex]::matches 或其他方式从那里提取数字。问题是目录中大约有 10 个文件,我需要从所有文件中获取这个值。现在我只从第一个文件中得到匹配项。
我期待得到一系列类似于上面的行。我认为“-First 1”让我获得了第一场比赛,并且每个文件都会发生这种情况。使用 Select-String 的好处是它返回的对象,因为它包含文件名,其中有一个 ID,我必须将提取的值绑定到它,可能在 PSCustomObject 中。但是现在我只能得到第一行。
我以为“-First 1”让我得到了第一场比赛,并且每个文件都会发生这种情况。
不,它只获取第一个输出对象overall,跨越所有文件。
另请注意,您不需要
Select-Object *
(缩写:Select-Object -Property *
与-First
;事实上,如果您这样做,您将不必要地创建Select-String
的输出对象的副本。
Select-String
的-List
开关将输出限制为一个匹配每个文件.
Select-String -List -Path ".\TMUSite_*.sav" -Pattern "Unleaded"
为每个文件选择第一个(尽管
-List
更好!):
$Unleaded = (Get-Item -Path ".\TMUSite_*.sav" | foreach {
Select-String -path $_ -Pattern "Unleaded" | Select-Object -First 1
})
从那里,您可以访问
$unleaded.Line
的文本,以及 $Unleaded.Filename
或 .Path
的文本。您的原始示例使用了$u_line = (...).Line
,因此它丢弃了其他属性