Hãy thử cái này
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
}
Nó lấy đường dẫn đầy đủ của tệp và thay thế thư mục hiện tại bằng thư mục bạn muốn. Ví dụ, bạn chạy lệnh này trong thư mục C:\1\
( $PWD = C:\1\
). Nếu nó tìm thấy các tập tin C:\1\2\file.txt
, nó sẽ cung cấp cho bạn một $dest
số some_folder\2\file.txt
.
Khối đầu tiên nếu có, vì vậy bạn không thử chuyển đổi một thư mục.
Các thư mục phải được tạo nếu chúng chưa tồn tại - ban đầu tôi quên mất điều đó.
Nếu bạn muốn UTF8 không có BOM, hãy thay thế get-content $i | out-file -encoding utf8 -filepath $dest
dòng này bằng ( nguồn ) sau:
$filecontents = Get-Content $i
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllLines($i, $filecontents, $Utf8NoBomEncoding)
Lưu ý rằng điều này có thể không hiệu quả lắm đối với các tệp lớn hơn, vì nó đọc toàn bộ tệp vào bộ nhớ trước khi ghi lại chúng. Nếu cần hiệu quả, có thể đọc từng dòng hoặc thậm chí một số byte cụ thể tại một thời điểm. Tuy nhiên, tôi chỉ muốn viết một chương trình nhanh bằng C # vào thời điểm đó (vì dù sao bạn cũng đang sử dụng các phiên bản .NET trong PS).
Get-ChildItem
nhưng khôngGet-Children
...