如何使用powershell脚本将许多编码的文件(ANSI,UTF8 BOM等)转换为没有BOM的UTF8?

How to convert many files encoded (ANSI, UTF8 BOM etc.) to UTF8 without BOM with powershell script?

提问人:Jax22 提问时间:9/15/2022 更新时间:9/16/2022 访问量:574

问:

我正在尝试将 ANSI 和 UTF-8 BOM 文件转换为仅没有 BOM 的 UTF-8。我找到了一个可以做到这一点的代码,但是在我的文件中,ANSI文件中的“président”一词在UTF8中被转换为“prxE9sident”或“pr?sident”(事故问题é)。

我在父文件夹中运行的脚本 powershell 代码:

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
$source = "path"
$destination = "some_folder"

foreach ($i in Get-ChildItem -Recurse -Force) {
    if ($i.PSIsContainer) {
        continue
    }

    $path = $i.DirectoryName -replace $source, $destination
    $name = $i.Fullname -replace $source, $destination

    if ( !(Test-Path $path) ) {
        New-Item -Path $path -ItemType directory
    }

    $content = get-content $i.Fullname

    if ( $content -ne $null ) {

        [System.IO.File]::WriteAllLines($name, $content, $Utf8NoBomEncoding)
    } else {
        Write-Host "No content from: $i"   
    }
}

有什么解决方案可以使重音远离 ANSI 和其他文件吗?

PowerShell 编码 UTF-8 ANSI

评论

0赞 iRon 9/15/2022
$Null应该在相等性比较的左侧。如果文件使用换行符关闭,则数组中的最后一项是计算结果为 $False 的,因此甚至不会更新文件。$Content$Nullif ( $content -ne $null ) { ...
0赞 Jax22 9/15/2022
它有效,谢谢!现在我观察到我的问题只在于 UTF8 BOM 文件应该转换为没有 BOM 的 UTF8(并且没有 ANSI 文件),您认为有什么简单的方法可以使用此代码做到这一点吗?谢谢
0赞 iRon 9/15/2022
我认为我的最后一条评论实际上是不正确的。
0赞 iRon 9/15/2022
尝试:[System.IO.File]::WriteAllLines($name, $content, ([System.Text.Encoding]::GetEncoding(1252)))
0赞 Jax22 9/15/2022
它完美地工作!非常感谢您的回答和反应。有好的一天!

答:

1赞 iRon 9/15/2022 #1

在这种情况下,实际上有两个 PowerShell Gotchas

if ( $content -ne $null ) { ...
  1. $Null应位于相等比较运算符的左侧
  2. 如果文件使用换行符结束,则结果数组中的最后一项是Get-Content$Null

这可能会导致相关条件意外计算,因此您的脚本甚至不会更新所需的文件。$False

根据其他注释,若要将文件另存为 ANSI,应使用 Windows-1252 编码:

[System.IO.File]::WriteAllLines($name, $content, ([System.Text.Encoding]::GetEncoding(1252)))