在 PowerShell 中递归地将文本文件转换为 UTF-8

Rom*_*man 7 windows-7 powershell conversion

我有一个包含文本文件的文件夹,其中包含其他文件夹,其中还包含一些文本文件。我需要在 PowerShell 中递归地将所有这些文件转换为 UTF-8 编码,并在此过程中保留文件夹结构。我试过这个:

foreach( $i in get-childitem -recurse -name ) {
    get-content $i | out-file -encoding utf8 -filepath some_folder/$i
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用,它无法重现文件夹的层次结构。我该如何处理这个问题?

Bob*_*Bob 13

试试这个。

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

    $dest = $i.Fullname.Replace($PWD, "some_folder")
    if (!(Test-Path $(Split-Path $dest -Parent))) {
        New-Item $(Split-Path $dest -Parent) -type Directory
    }

    get-content $i | out-file -encoding utf8 -filepath $dest
}
Run Code Online (Sandbox Code Playgroud)

它获取文件的完整路径并将当前目录替换为您想要的目录。例如,您在目录C:\1\( $PWD = C:\1\) 中运行此命令。如果找到该文件C:\1\2\file.txt,它会给你$destsome_folder\2\file.txt

第一个 if 块在那里,所以您不要尝试转换目录。

如果目录不存在,则必须创建它们 - 我最初忘记了这一点。


如果您想要没有 BOM 的 UTF8,请用get-content $i | out-file -encoding utf8 -filepath $dest以下内容替换该行 ( source ):

$filecontents = Get-Content $i
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllLines($i, $filecontents, $Utf8NoBomEncoding)
Run Code Online (Sandbox Code Playgroud)

请注意,这对于较大的文件可能不是很有效,因为它会在再次写入文件之前将整个文件读入内存。如果需要效率,可以逐行读取,甚至一次读取特定数量的字节。但是,到那时我宁愿只用 C# 编写一个快速程序(因为无论如何您都会在 PS 中使用 .NET 功能)。