Vor kurzem musste ich bei einer Vielzahl von Skript- und Konfigurationsdateien sicherstellen, dass sie einheitlich das in der Windows Welt übliche CRLF als Zeilenendezeichen (EOL) benutzen, und nicht CR wie unter MacOS oder LF wie unter Linux. Außerdem musste ich scherstellen, dass alle Dateien ASCII kodiert waren und zwar incl. der passenden Codepage für Westeuropa, damit auch Deutsche Umlaute richtig dargestellt werden. Hier ist mein PowerShell Skript mit dem ich dies bewerkstellig habe.
Function Set-EOL {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,Position=1)]
[string]$File,
[Parameter(Mandatory=$True,Position=2)]
[ValidateSet("mac","unix","win")]
[string]$LineEnding,
[Parameter(Mandatory=$True,Position=3)]
[string]$Encoding
)
Switch ($LineEnding) {
"mac" { $eol="`r" }
"unix" { $eol="`n" }
"win" { $eol="`r`n" }
}
[System.Text.Encoding]$encoding = [System.Text.Encoding]::GetEncoding($Encoding)
$text = [IO.File]::ReadAllText($file,$encoding) -replace "`r`n", "`n" # Replace CR+LF with LF
[IO.File]::WriteAllText($file, $text,$encoding) # Replace CR with LF
$text = [IO.File]::ReadAllText($file,$encoding) -replace "`r", "`n"
[IO.File]::WriteAllText($file, $text,$encoding)
# Now line-endings are LF, replace now LF with intended EOL char
if ($eol -ne "`n") {
$text = [IO.File]::ReadAllText($file,$encoding) -replace "`n", $eol
[System.IO.File]::WriteAllText($file,$text,$encoding)
}
}
Get-ChildItem -Path "C:\Temp\*" -Include *.txt,*.ps1,*.json -Recurse -Depth 3 | ForEach-Object {
Set-EOL -File $_.FullName -LineEnding 'win' -Encoding 'iso-8859-1'
}