在输出中包含文件名

Include filename in output

我想从文件夹中的文件中获取内容(忽略 header 行,因为某些文件可能 ONLY 包含 header)。但是在输出中,我想包括从中读取该行的文件名。到目前为止,我有以下内容:

Get-ChildItem | Get-Content | Where { $_ -notlike "HEADER_LINE_TEXT" } | Out-File -FilePath output_text.txt

我尝试在 Where 块中创建一个变量,$filename=$_.BaseName,并在输出中使用它,但这没有用。

编辑:

我得到了以下结果:

Get-ChildItem -Path . | Where-Object { $_.FullName -like "*records.txt"; $fname=$_FullName; } | Get-Content | Select-Object { ($fname + "|" + $_.Trim()) } | Where { $_ -notlike "*HEADER_LINE_TEXT*" } | Format-Table -HideTableHeaders | Out-File -FilePath output_text.txt

这看起来很长,可能可以变得更短更清晰。有人可以帮忙清理一下吗?我将选择 post 解决方案,或者投票选出一个更简洁的解决方案,如果有人 posted。谢谢

这看起来像是一种情况,如果不以增加一点内存使用为代价,将它变成一个衬垫会使其更具可读性。

$InputFolder = "C:\example"
$OutputFile = "C:\example\output_text.txt"
$Files = Get-ChildItem $InputFolder | Where-Object { $_.FullName -like "*records.txt"}
Foreach ($File in $Files) {
    $FilteredContent = Get-Content $File.FullName | Where-Object {$_ -notlike "*HEADER_LINE_TEXT*"}
    $Output = $FilteredContent | Foreach-Object { "$($File.FullName)|$($_.Trim())" }
    $Output | Out-File $OutputFile -Append
}

如果您为了简洁而打算采用单行样式,则可以通过使用参数位置和别名来缩短长度。

这里有一些其他的变化:

  • 第一个 where 块中不需要第二个分号。
  • 我认为您的变量不起作用,因为您错过了 $_fullname 之间的时间段。
  • Format-Table不需要,因为你已经有了要输出的字符串
  • 您可以稍微优化一下,将第二个 where 移得更早一些,这样您就不会 trim() 在刚要过滤的行上
  • 您似乎想使用 foreach 而不是 select
  • 删除了用于字符串连接的 + 运算符,而是使用 $() 计算括号内的值


gci . | 
    ? { $_.FullName -like "*records.txt"; $fname=$_.FullName } | 
    % { gc $_.FullName } | 
    ? { $_ -notlike "*HEADER_LINE_TEXT*" } | 
    % { "$fname|$($_.Trim())" } | 
    Out-File output_text.txt