在输出中包含文件名
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
我想从文件夹中的文件中获取内容(忽略 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