Yapabildiğim zaman tüm Powershell komutlarını kullanmayı seviyorum. Biraz test yaptıktan sonra yapabileceğim en iyisi bu.
$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}
İlk üç satır bunu okumayı kolaylaştırmak için, isterseniz gerçek komutların içindeki değişkenleri tanımlayabilirsiniz. Bu kod örneğinin anahtarı, normal ifade eşleşmesini kabul eden bir filtre olan "Where-Object" komutudur. Normal ifade desteğinin biraz garip olduğu belirtilmelidir. Bir PDF referans kart buldum burada sol tarafta desteklenen karakter var.
[DÜZENLE]
"@Johannes Rössel" de belirtildiği gibi, son iki satırı tek bir satıra da azaltabilirsiniz.
((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination
Temel fark, Johannes'in yolunun nesne filtrelemesi ve benim yolumun metin filtrelemesidir. Powershell ile çalışırken, nesneleri kullanmak neredeyse her zaman daha iyidir.
[EDIT2]
@Smoknheap'ın belirttiği gibi, yukarıdaki komut dosyaları klasör yapısını düzleştirir ve tüm dosyalarınızı tek bir klasöre koyar. Klasör yapısını koruyan bir anahtar olup olmadığından emin değilim. -Recurse anahtarını denedim ve işe yaramadı. Bunu işe almak için tek yolu dize manipülasyona geri dönmek ve benim filtre klasör eklemek için.
$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,"")
}
Bunu yapmanın daha zarif bir yolu olduğundan eminim, ancak testlerimden işe yarıyor. Her şeyi toplar ve daha sonra hem ad eşleşmeleri hem de klasör nesneleri için filtreler. Dize manipülasyonuna erişmek için ToString () yöntemini kullanmak zorunda kaldı.
[EDIT3]
Şimdi her şeyi doğru yaptığınızdan emin olmak için yolu bildirmek istiyorsanız. "Write-Host" Komutunu kullanabilirsiniz. İşte size neler olduğuna dair bazı ipuçları verecek olan kod.
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,"")
}
Bu, ilgili dizeleri döndürmelidir. Bir yerde hiçbir şey almazsanız, hangi öğenin sorun yaşadığını bilirsiniz.
Bu yardımcı olur umarım