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
,它会给你$dest
的some_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 功能)。
归档时间: |
|
查看次数: |
25414 次 |
最近记录: |