Спробуйте це.
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
.
Перший блок, якщо є, тому ви не намагаєтеся конвертувати каталог.
Каталоги повинні бути створені, якщо вони ще не існують - я спочатку це забув.
Якщо ви бажаєте використовувати 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 fuctions в PS в будь-якому випадку).
Get-ChildItem
але ніGet-Children
...