Tôi thích sử dụng tất cả các lệnh Powershell khi tôi có thể. Sau một chút thử nghiệm, đây là điều tốt nhất tôi có thể làm.
$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}
Ba dòng đầu tiên chỉ để làm cho nó dễ đọc hơn, bạn có thể xác định các biến bên trong các lệnh thực tế nếu bạn muốn. Chìa khóa của mẫu mã này là lệnh "Where-Object" là bộ lọc chấp nhận khớp biểu thức chính quy. Cần lưu ý rằng hỗ trợ biểu thức thường xuyên là một chút lạ. Tôi tìm thấy một thẻ tham khảo PDF đây có các ký tự được hỗ trợ ở phía bên trái.
[CHỈNH SỬA]
Như "@Johannes Rössel" đã đề cập, bạn cũng có thể giảm hai dòng cuối xuống một dòng.
((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination
Sự khác biệt chính là cách của Julian thực hiện lọc đối tượng và cách của tôi là lọc văn bản. Khi làm việc với Powershell, hầu như luôn luôn tốt hơn khi sử dụng các đối tượng.
[EDIT2]
Như @smoknheap đã đề cập, các tập lệnh trên sẽ làm phẳng cấu trúc thư mục và đặt tất cả các tệp của bạn vào một thư mục. Tôi không chắc chắn nếu có một công tắc giữ lại cấu trúc thư mục. Tôi đã thử công tắc -Recurse và nó không giúp được gì. Cách duy nhất tôi có được điều này để làm việc là quay trở lại thao tác chuỗi và thêm các thư mục vào bộ lọc của tôi.
$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,"")
}
Tôi chắc chắn rằng có một cách thanh lịch hơn để làm điều này, nhưng từ các thử nghiệm của tôi, nó hoạt động. Nó thu thập mọi thứ và sau đó lọc cho cả đối tượng tên và đối tượng thư mục. Tôi đã phải sử dụng phương thức ToString () để có quyền truy cập vào thao tác chuỗi.
[EDIT3]
Bây giờ nếu bạn muốn báo cáo đường dẫn để đảm bảo bạn có mọi thứ chính xác. Bạn có thể sử dụng lệnh "Write-Host". Đây là mã sẽ cung cấp cho bạn một số gợi ý về những gì đang xảy ra.
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,"")
}
Điều này sẽ trả về các chuỗi có liên quan. Nếu bạn không nhận được gì ở đâu đó, bạn sẽ biết mặt hàng nào đang gặp vấn đề.
Hi vọng điêu nay co ich