How do I write Set-Content to a file using Powershell?
Categories:
Mastering File Output with PowerShell's Set-Content

Learn how to effectively use the Set-Content
cmdlet in PowerShell to write text, overwrite files, append data, and handle various file encoding scenarios.
PowerShell's Set-Content
cmdlet is a fundamental tool for writing text to files. Whether you need to create a new file, overwrite an existing one, or append data, Set-Content
provides a straightforward and powerful way to manage file content. This article will guide you through its core functionalities, common use cases, and important considerations like encoding.
Basic File Writing and Overwriting
The most common use of Set-Content
is to write a string or an array of strings to a file. By default, if the file specified by the -Path
parameter exists, Set-Content
will overwrite its entire content. If the file does not exist, it will be created.
# Create a new file or overwrite an existing one
Set-Content -Path "C:\Temp\MyFile.txt" -Value "This is the first line."
Set-Content -Path "C:\Temp\MyFile.txt" -Value "This line overwrites the previous content."
# Writing multiple lines (array of strings)
$lines = @("Line 1", "Line 2", "Line 3")
Set-Content -Path "C:\Temp\MultiLine.txt" -Value $lines
Examples of basic Set-Content
usage for creating and overwriting files.
Set-Content
without the -Append
parameter, as it will silently overwrite existing file content, potentially leading to data loss. Always double-check your -Path
.Appending Content to Existing Files
To add new content to the end of an existing file without overwriting its current content, you can use the -Append
parameter. If the file does not exist, Set-Content -Append
will create it and write the specified content.
# Create a file with initial content
Set-Content -Path "C:\Temp\Log.txt" -Value "[$(Get-Date)] Application started."
# Append a new line to the file
Set-Content -Path "C:\Temp\Log.txt" -Value "[$(Get-Date)] User logged in." -Append
Set-Content -Path "C:\Temp\Log.txt" -Value "[$(Get-Date)] Operation completed." -Append
Appending log entries to a file using Set-Content -Append
.
Understanding File Encoding
File encoding is crucial, especially when dealing with international characters or when files are consumed by other applications. Set-Content
uses a default encoding, which can vary depending on your PowerShell version and system configuration. It's often best practice to explicitly specify the encoding using the -Encoding
parameter.
flowchart TD A[Start] --> B{Content to Write} B --> C{File Exists?} C -- Yes --> D{Append Parameter?} D -- Yes --> E[Append Content] D -- No --> F[Overwrite Content] C -- No --> G[Create New File] E --> H{Encoding Specified?} F --> H G --> H H -- Yes --> I[Write with Specified Encoding] H -- No --> J[Write with Default Encoding] I --> K[End] J --> K
Decision flow for Set-Content
operations including append and encoding.
Common encoding options include ASCII
, UTF8
, UTF8NoBOM
, Unicode
(UTF-16LE), UTF7
, UTF32
, and Default
(system's active code page). For most modern applications and cross-platform compatibility, UTF8
or UTF8NoBOM
are often recommended.
# Write with UTF8 encoding (recommended for most cases)
Set-Content -Path "C:\Temp\UTF8File.txt" -Value "Hello, world! Привет мир!" -Encoding UTF8
# Write with ASCII encoding (limited character set)
Set-Content -Path "C:\Temp\ASCIIFile.txt" -Value "This is ASCII." -Encoding ASCII
# Write with Unicode (UTF-16LE) encoding
Set-Content -Path "C:\Temp\UnicodeFile.txt" -Value "Unicode text example." -Encoding Unicode
Specifying different encodings with Set-Content
.
UTF8NoBOM
is often preferred over UTF8
to avoid issues caused by the Byte Order Mark (BOM).Using Set-Content
with Piped Input
Set-Content
can also receive input from the pipeline, making it very flexible for processing and redirecting output from other cmdlets. This is a powerful feature for scripting.
# Get a list of running processes and save their names to a file
Get-Process | Select-Object -ExpandProperty ProcessName | Set-Content -Path "C:\Temp\ProcessNames.txt"
# Get directory contents and save to a file, appending to existing content
Get-ChildItem -Path "C:\Windows" | Select-Object -ExpandProperty Name | Set-Content -Path "C:\Temp\WindowsDir.txt" -Append
Piping cmdlet output directly to Set-Content
.