我想从文件夹中的文件中获取内容(忽略标题行,因为某些文件可能仅包含标题)。但是在输出中,我想要包含从中读取行的文件名。到目前为止,我有以下内容:
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
这看起来很冗长,可能会变得更短更清晰。有人可以帮忙清理一下吗?如果发布了解决方案,我会发布解决方案,或投票选择更清洁的解决方案。感谢。
答案 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