Set-Content is one of those core PowerShell cmdlets that I can't do without. I still remember using VBscript before we could use PowerShell to write to a file. I remember always trying to remember what kind of object I needed to use and the method name. Was it FileSystemObject, FileObject or what? It was a pain! Even when I did recall the method name was CreateTextFile(), I'd always forget to add True as the second argument.

If you're a beginner/intermediate PowerShell scripter, be sure to check out my FREE mini-course on Building a PowerShell Tool! 9,000+ words of deep explanation and insights on how to build a PowerShell tool.

Here's an example of the monstrosity I'm talking about.

Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile="c:\file.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write "test string"
objFile.Close

Compare that VBScript with this PowerShell:

Set-Content -Path 'C:\file.txt' -Value 'test string'

Which one do you prefer? I'll take the PowerShell way! The PowerShell way uses a single cmdlet called Set-Content. This cmdlet allows us to much more easily use PowerShell to write to a file. This PowerShell cmdlet is a built-in cmdlet that has one purpose; to write to a file.

It may have some parameters here and there to change up that behavior a bit, but it's solely focused on writing to a file. Not to be confused with Add-Content though since they are similar. Set-Content overwrites the entire file while Add-Content adds to a file. I learned that one the hard way multiple times when I first got started!

Creating a File/Overwriting a File

The Set-Content cmdlet is fairly simple. Below is a good example. This example shows that Set-Content can both create a file if it doesn't exist or it can replace all of the contents inside of a pre-existing file.

PS> Test-Path -Path C:\test.txt
False
PS> Set-Content -Path C:\test.txt -Value 'foo'
PS> Get-Content -Path C:\test.txt
foo
PS> Set-Content -Path C:\test.txt -Value 'bar'
PS> Get-Content -Path C:\test.txt
bar

Output to a File

One cmdlet that can output to a file is Out-File, but Set-Content can perform the same task albeit a little differently.

Perhaps you'd like to pull specific pieces of text from one text file and output lines to another file. ´┐ŻBy using Get-Content and Set-Content, you can make this happen. Maybe I've got a text file with one server and their status per line. I'd like to read each server's status and output that to a file. Using Get-Content to read the file and Set-Content to write to file, it's possible.

PS> Get-Content -Path C:\test.txt
SRV1 Status: Up
SRV2 Status: Down
SRV3 Status: Up
PS> Get-Content -Path C:\test.txt | ForEach-Object {
>>> $srvName = $_.Split(' ')[0]
>>> Set-Content -Path "C:\$srvName.txt" -Value $_
}
PS> Get-ChildItem -Filter 'SRV*'
Directory: C:\
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       10/29/2017  12:38 PM             17 SRV1.txt
-a----       10/29/2017  12:38 PM             19 SRv2.txt
-a----       10/29/2017  12:38 PM             17 SRV3.txt

PS> Get-ChildItem -Filter 'SRV*' | Get-Content
SRV1 Status: Up
SRV2 Status: Down
SRV3 Status: Up

Set-Content is one of those core cmdlets that gets used constantly. It's not fancy but works every time and is one you should have in your PowerShell bag of tricks.

For a full breakdown, check out the Set-Content Microsoft documentation.

Join the Jar Tippers on Patreon

It takes a lot of time to write detailed blog posts like this one. In a single-income family, this blog is one way I depend on to keep the lights on. I'd be eternally grateful if you could become a Patreon patron today!

Become a Patron!