ลองอันนี้.
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 ที่ไม่มี BOM ให้แทนที่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
...