Saya suka menggunakan semua perintah Powershell ketika saya bisa. Setelah sedikit pengujian, ini yang terbaik yang bisa saya lakukan.
$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}
Tiga baris pertama hanya untuk membuatnya lebih mudah dibaca, Anda dapat mendefinisikan variabel di dalam perintah yang sebenarnya jika Anda mau. Kunci untuk sampel kode ini adalah perintah "Di mana-Objek" yang merupakan filter yang menerima pencocokan ekspresi reguler. Perlu dicatat bahwa dukungan ekspresi reguler agak aneh. Saya menemukan kartu referensi PDF di sini yang memiliki karakter yang didukung di sisi kiri.
[EDIT]
Seperti "@Johannes Rössel" sebutkan, Anda juga dapat mengurangi dua baris terakhir menjadi satu baris.
((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination
Perbedaan utamanya adalah cara Johannes melakukan penyaringan objek dan cara saya melakukan penyaringan teks. Saat bekerja dengan Powershell, hampir selalu lebih baik menggunakan objek.
[EDIT2]
Seperti @smoknheap disebutkan, skrip di atas akan meratakan struktur folder dan meletakkan semua file Anda dalam satu folder. Saya tidak yakin apakah ada saklar yang mempertahankan struktur folder. Saya mencoba saklar -Recurse dan itu tidak membantu. Satu-satunya cara agar ini berfungsi adalah kembali ke manipulasi string dan menambahkan folder ke filter saya.
$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,"")
}
Saya yakin ada cara yang lebih elegan untuk melakukan ini, tetapi dari tes saya berhasil. Itu mengumpulkan semuanya dan kemudian memfilter untuk pencocokan nama dan objek folder. Saya harus menggunakan metode ToString () untuk mendapatkan akses ke manipulasi string.
[EDIT3]
Sekarang jika Anda ingin melaporkan jalur untuk memastikan semuanya sudah benar. Anda dapat menggunakan perintah "Write-Host". Berikut kode yang akan memberi Anda beberapa petunjuk tentang apa yang terjadi.
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,"")
}
Ini harus mengembalikan string yang relevan. Jika Anda tidak mendapatkan apa pun di suatu tempat, Anda akan tahu barang apa yang bermasalah.
Semoga ini membantu