在输出中包含文件名

时间:2017-02-22 14:26:38

标签: powershell powershell-v4.0

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

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

这看起来很冗长,可能会变得更短更清晰。有人可以帮忙清理一下吗?如果发布了解决方案,我会发布解决方案,或投票选择更清洁的解决方案。感谢。

1 个答案:

答案 0 :(得分:1)

这看起来像是一种情况,它会让它更具可读性,不会因为额外的内存使用量而成为单行代码。

$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