ฉันชอบใช้คำสั่ง Powershell ทั้งหมดเมื่อฉันสามารถ หลังจากการทดสอบเล็กน้อยนี่เป็นสิ่งที่ดีที่สุดที่ฉันสามารถทำได้
$source = "C:\test"
$destination = "C:\test2"
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"
$bin = Get-ChildItem -Path $source | Where-Object {$_.Name -match $filter}
foreach ($item in $bin) {Copy-Item -Path $item.FullName -Destination $destination}
สามบรรทัดแรกเป็นเพียงการทำให้อ่านง่ายขึ้นคุณสามารถกำหนดตัวแปรภายในคำสั่งจริงได้หากต้องการ กุญแจสำคัญในตัวอย่างโค้ดนี้คือคำสั่ง "Where-Object" ซึ่งเป็นตัวกรองที่ยอมรับการจับคู่นิพจน์ปกติ ควรสังเกตว่าการรองรับการแสดงออกปกติเป็นบิตแปลก ฉันพบการ์ดอ้างอิง PDF ที่นี่ซึ่งมีอักขระที่สนับสนุนทางด้านซ้าย
[แก้ไข]
ตามที่ "@Johannes Rössel" พูดถึงคุณสามารถลดสองบรรทัดสุดท้ายลงเป็นบรรทัดเดียว
((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination
ข้อแตกต่างที่สำคัญคือวิธีของโยฮันเนสทำการกรองวัตถุ เมื่อทำงานกับ Powershell การใช้วัตถุจะดีกว่า
[EDIT2]
ตามที่ @ smoknheap พูดถึงสคริปต์ข้างต้นจะแผ่โครงสร้างของโฟลเดอร์ออกมาและวางไฟล์ทั้งหมดของคุณไว้ในโฟลเดอร์เดียว ฉันไม่แน่ใจว่ามีสวิตช์ที่เก็บโครงสร้างของโฟลเดอร์ไว้หรือไม่ ฉันลองใช้สวิตช์ -Recurse และไม่ได้ช่วยอะไร วิธีเดียวที่ฉันได้รับการทำงานคือกลับไปที่การจัดการสตริงและเพิ่มในโฟลเดอร์ในตัวกรองของฉัน
$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
}
ฉันแน่ใจว่ามีวิธีที่สง่างามกว่าในการทำเช่นนี้ แต่จากการทดสอบของฉันก็ใช้งานได้ มันรวบรวมทุกอย่างของแล้วกรองทั้งชื่อที่ตรงกันและวัตถุโฟลเดอร์ ฉันต้องใช้วิธี ToString () เพื่อเข้าถึงการจัดการสตริง
[edit3]
ตอนนี้ถ้าคุณต้องการรายงานเส้นทางเพื่อให้แน่ใจว่าคุณมีทุกอย่างถูกต้อง คุณสามารถใช้คำสั่ง "เขียนโฮสต์" นี่คือรหัสที่จะให้คำแนะนำแก่คุณเกี่ยวกับสิ่งที่เกิดขึ้น
cls
$source = "C:\test"
$destination = "C:\test2"
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"
$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
Write-Host "
----
Obj: $item
Path: "$item.fullname"
Destination: "$item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
}
สิ่งนี้ควรส่งคืนสตริงที่เกี่ยวข้อง หากคุณไม่ได้อะไรเลยคุณจะรู้ว่ารายการใดมีปัญหา
หวังว่านี่จะช่วยได้