Попробуй это.
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
}
Он захватывает полный путь к файлу и заменяет текущий каталог тем, который вам нужен. Например, вы запускаете эту команду в каталоге C:\1\
($PWD = C:\1\
). Если он найдет файл C:\1\2\file.txt
, он даст вам $dest
для some_folder\2\file.txt
.
Первый блок if есть, поэтому вы не пытаетесь конвертировать каталог.
Каталоги должны быть созданы, если они еще не существуют - я изначально забыл это.
Если вы хотите UTF8 без спецификации, замените get-content $i | out-file -encoding utf8 -filepath $dest
строка со следующим (источник):
$filecontents = Get-Content $i
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllLines($i, $filecontents, $Utf8NoBomEncoding)
Обратите внимание, что это может быть не очень эффективно для больших файлов, так как он читает целые файлы в память, прежде чем записать их снова. Если требуется эффективность, можно читать строку за строкой или даже определенное количество байтов за раз. Однако я бы предпочел просто написать быструю программу на C # к этому моменту (так как в любом случае вы будете использовать функции .NET в PS).