?. (Join-Path (Split-Path -Parent $MyInvocation.MyCommand.Definition) "encoding_policy_resolver_v1.0.ps1") function Normalize-Newlines([string]$s,[ValidateSet("CRLF","LF")]$Style="CRLF"){ $t=$s -replace "`r`n","`n"; $t=$t -replace "`r","`n" if($Style -eq "CRLF"){ return [string]::Join("`r`n",$t -split "`n") } else { return $t } } function Get-TargetEncoding([string]$path){ $profile = Get-ProjectProfile $ext = [IO.Path]::GetExtension($path) if(-not $ext){ $ext = '' } $ext = $ext.ToLowerInvariant() $nl = "CRLF" $enc = "UTF8NOBOM" switch($ext){ ".ps1" { if($profile -eq 'SEEDBOX'){ $enc="UTF8BOM" } else { $enc="UTF8NOBOM" }; $nl="CRLF" } ".cmd" { $enc="ASCII"; $nl="CRLF" } ".bat" { $enc="ASCII"; $nl="CRLF" } ".sh" { $enc="ASCII"; $nl="LF" } default{ $enc="UTF8NOBOM"; $nl="CRLF" } } return @{Encoding=$enc; NewLine=$nl} } function SafeWrite-Text([string]$Path,[string]$Content){ $pol = Get-TargetEncoding $Path $norm = Normalize-Newlines $Content $pol.NewLine $encObj = $null switch($pol.Encoding){ "UTF8BOM" { $encObj=[Text.UTF8Encoding]::new($true) } "UTF8NOBOM" { $encObj=[Text.UTF8Encoding]::new($false) } "ASCII" { $encObj=[Text.ASCIIEncoding]::new() } default { $encObj=[Text.UTF8Encoding]::new($false) } } $bak = $Path + '.bak_' + (Get-Date -Format 'yyyyMMdd_HHmmss') if(Test-Path $Path){ Copy-Item -LiteralPath $Path -Destination $bak -Force } $tmp = $Path + '.tmp' [IO.File]::WriteAllText($tmp,$norm,$encObj) $shaTmp = (Get-FileHash -Algorithm SHA256 -LiteralPath $tmp).Hash Move-Item -LiteralPath $tmp -Destination $Path -Force $shaFinal = (Get-FileHash -Algorithm SHA256 -LiteralPath $Path).Hash return @{bak=$bak; shaTmp=$shaTmp; shaFinal=$shaFinal; policy=$pol} }