# encoding: ascii
# api: powershell
# title: Set-Encoding
# description: Provides an easy way to change the text encoding on a lot of scripts at once.
# version: 0.1
# type: function
# author: Jason Ferris
# license: CC0
# function: Set-Encoding
# x-poshcode-id: 2288
# x-archived: 2017-05-16T03:34:57
# x-published: 2011-10-07T07:22:00
#
# It calls the Out-File command with the -Encoding parameter and the -Force switch.
# Very useful for fixing problems when trying to sign non-ASCII format files.
# Note: Don’t use on your MP3’s or other non-text files :)
#
function Set-Encoding{
<#
.Synopsis
Takes a Script file or any other text file into memory and Re-Encodes it in the format specified.
.Parameter Source
The path to the file to be re-encoded.
.Parameter Destination
The path to write the corrected file to
.Parameter Encoding
The encoding to convert to
Note:
Default Uses the encoding of the system's current ANSI code page.
OEM Uses the current original equipment manufacturer code page identifier for the operating system.
.Example
ls *.ps1 | Set-Encoding ASCII
.Example
ls *.ps1 | Set-Encoding UTF8 -Destination { [System.IO.Path]::ChangeExtension($_.FullName, ".utf8.ps1") }
.Description
Provides an easy way to change the text encoding on a lot of scripts at once.
.Notes
Don't use on non-text files!
The script just calls Out-File with the -Encoding parameter and the -Force switch, but it's very useful for making sure all your script files are correctly UTF8 or ASCII encoded so they can be signed.
#>
[CmdletBinding()]
PARAM(
[Parameter(Position=0,Mandatory=$true,ValueFromPipeline=$false)]
[ValidateSet("Unicode","UTF7","UTF8","UTF32","ASCII", "BigEndianUnicode","Default", "OEM")]
[string]$Encoding
,
[Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
[ValidateScript({
if((resolve-path $_).Provider.Name -ne "FileSystem") {
throw "Specified Path is not in the FileSystem: '$_'"
}
return $true
})]
[Alias("Fullname","Path","File")]
[string]$Source
,
[Parameter(Position=2, Mandatory=$false, ValueFromPipelineByPropertyName=$true)]
[string]$Destination = $Source
,
[Switch]$Passthru
)
PROCESS{
Write-Verbose "Encoding content from '$Source' into '$Destination' with $Encoding encoding."
(Get-Content $Source) | Out-File -FilePath $Destination -Encoding $Encoding -Force
if($Passthru){ Get-Item $Destination }
}
}