提问人:Jax22 提问时间:9/15/2022 更新时间:9/16/2022 访问量:574
如何使用powershell脚本将许多编码的文件(ANSI,UTF8 BOM等)转换为没有BOM的UTF8?
How to convert many files encoded (ANSI, UTF8 BOM etc.) to UTF8 without BOM with powershell script?
问:
我正在尝试将 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 和其他文件吗?
答:
1赞
iRon
9/15/2022
#1
在这种情况下,实际上有两个 PowerShell Gotchas:
if ( $content -ne $null ) { ...
$Null
应位于相等比较运算符的左侧- 如果文件使用换行符结束,则结果数组中的最后一项是
Get-Content
$Null
这可能会导致相关条件意外计算,因此您的脚本甚至不会更新所需的文件。$False
根据其他注释,若要将文件另存为 ANSI,应使用 Windows-1252
编码:
[System.IO.File]::WriteAllLines($name, $content, ([System.Text.Encoding]::GetEncoding(1252)))
评论
$Null
应该在相等性比较的左侧。如果文件使用换行符关闭,则数组中的最后一项是计算结果为$False
的,因此甚至不会更新文件。$Content
$Null
if ( $content -ne $null ) { ...
[System.IO.File]::WriteAllLines($name, $content, ([System.Text.Encoding]::GetEncoding(1252)))