将目录中的TXT文件合并到一个文件中,并在末尾添加用于文件名的列

时间:2017-10-09 19:22:59

标签: powershell copy

我在一个目录中有一组txt文件,我想合并在一起。

所有txt文件的内容格式如下:

IPAddress   Description             DNSDomain
---------   -----------             ---------
{192.168.1.2}   Microsoft Hyper-V   Network Adapter     
{192.168.1.30}  Microsoft Hyper-V   Network Adapter #2  

我有以下代码,它将所有txt文件合并到一个名为all.txt的txt文件中。

copy *.txt all.txt

从这个all.txt我看不出来自什么行的txt文件。关于任何代码位的任何想法都会在末尾txt文件中添加一个额外的列,其中包含行的文件名?

1 个答案:

答案 0 :(得分:1)

根据上面的评论,您已将Format-Table的输出放入文本文件中。请注意,Format-Table可能在屏幕上以直观结构化,但只是文本行。通过这样做,您使得处理数据变得更加困难。

如果您只想从Get-WMIObject cmdlet的结果中获取一些属性,请使用Select-Object(在此处给出的用法中)将有效地过滤所需属性的数据。

您可以通过写入结构化文件(即CSV)来保留数据的表格性质,而不是将文本写入简单文件:

Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName SERVERNAMEHERE |
  Select-Object PSComputerName, IPAddress, Description, DNSDomain |
  Export-Csv 'C:\temp\server.csv'

请注意,我们能够在每行数据中包含 PScomputerName 属性,从而有效地为您提供所需的额外数据列。

获取原始数据非常重要。您可以读取所有CSV数据并将其再次写出的一种方法可能如下所示:

Get-ChildItem *.csv -Exclude all.csv |
    Foreach-Object {Import-Csv $_} |
    Export-Csv all.csv

请注意,我们会在初始cmdlet中排除输出文件,以避免无休止地读取/写入同一文件。

如果您无法再次收集数据,则需要将文件整理在一起。使用Get-Content完成假脱机文件,如下所示:

Get-ChildItem *.txt -Exclude all.txt |
    Foreach-Object {Get-Content $_ -Raw} |
    Out-File all.txt

在您的情况下,您希望为每行添加后缀,因为您需要逐行处理文件:

$files = Get-ChildItem *.txt

foreach($file in $files) {
    $lines = Get-Content $file
    foreach($line in $lines) {
        "$line $($file.Name)" | Out-File all.txt -Append
    }
}