Home > PowerShell > Combine or Join Two Text Files Using PowerShell

Combine or Join Two Text Files Using PowerShell

Merging files together, or to a seperate file, is a snap with PowerShell using the Get-Content cmdlet. If you’ve never used the Add-Content cmdlet, I would suggest first reading my other article Append Text to a File Using Add-Content. The first thing we need to do is identify our two files, in my case I’ll be using file1.log and file2.log. In the first example, I append all the text of file2.log into the end of file1.log. In the second example, I’ll create a completely new file and dump the contents of both the files into the newly created file. In the last example, I’ll add the current date to the filename of a completly new log file.

1
2
$file2 = Get-Content "file2.log"
Add-Content "file1.log" $file2

Now, what if we want to copy the contents of file1.log and file2.log into a completely new file called file3.log

1
2
3
4
5
New-Item -ItemType file "file3.log"
$file1 = Get-Content "file1.log"
$file2 = Get-Content "file2.log"
Add-Content "file3.log" $file1
Add-Content "file3.log" $file2

What if we want to erase everything in file3.log before we add new content? In this case, instead of creating a new file, we’ll use the Clear-Contents cmdlet.

1
2
3
4
5
Clear-Content "file3.log"
$file1 = Get-Content "file1.log"
$file2 = Get-Content "file2.log"
Add-Content "file3.log" $file1
Add-Content "file3.log" $file2

Ok, well, what if I don’t know if file3.log already exists? If it doesn’t exist and I run the Clear-Contents cmdlet then I’ll get an error. And if it does exist and I try to create it as a new file I’ll still get an error. There’s an easy way to do this, we’ll use the New-Item cmdlet from the example above, but we’ll add the -force argument, so even if the file exists it will overwrite it.

1
2
3
4
5
New-Item -ItemType file "file3.log" -force
$file1 = Get-Content "file1.log"
$file2 = Get-Content "file2.log"
Add-Content "file3.log" $file1
Add-Content "file3.log" $file2

Alright, so I guess I got the hang of this, now lastly since these are log files, how can I append the date to the file name? Simple, with the Get-Date cmdlet. Let’s output our file name as YYYYMMDD-WebAccess.log in this example.

1
2
3
4
5
6
7
$date= (Get-Date).ToString("yyyyMMdd")
$NewFileName = "$date-WebAccess.log"
New-Item -ItemType file $NewFileName
$file1 = Get-Content "file1.log"
$file2 = Get-Content "file2.log"
Add-Content $NewFileName $file1
Add-Content $NewFileName $file2
  1. September 17th, 2009 at 22:52 | #1

    Great Tip, Gerardo.
    May i add this tip to our Powershelltips Database ?

    Regards,
    Bernard Flach
    Powershelltips.org

  2. Squashman
    February 19th, 2010 at 23:26 | #2

    Does this stream the content to the output file? I would think that would be really slow if it did. At least in batch it is really slow when using a for loop or type to parse a file and append it to the end of another.

    I currently have a batch file that ultimately does this.
    copy /b file1 + file2 + file3 filescombined

    I am kind of surprised that powershell doesn’t have a similar command to copy and combine files together. Well not really. Everything with powershell is twice as much code most of the time.

  1. February 12th, 2020 at 09:28 | #1
  2. March 26th, 2020 at 19:05 | #2