Birden çok dosyayı PowerShell'de başka bir diskte bulunanlarla eşleşen adlara taşıma
2 parçaya bölünmüş devasa bir torrent (6000'den fazla klasör ile 1.2tb) indiriyordum, bu yüzden 2. parçayı tasarlanan yere yerleştirdim ve torrent'in ana klasörü tam olarak ihtiyaç duyulan şey olduğu için sorun olmadı. 1. bölüm ana klasörü, ihtiyacım olan ad yerine bazı genel torrent adlarıyla adlandırıldı, bu nedenle torrent adını "kaynak" olarak yeniden adlandırmak yerine, bunun işe yarayıp şu anda genel adı "kaynak" olarak yeniden adlandıracağını düşündüm. Dosyalar sekmesinde tüm dosyaları seçtim ve sağ tıklayın> hepsini yeniden konumlandırdım ve bittorrent tüm dosyaları herhangi bir alt klasör olmadan aynı dizine taşıdı ve bir karışıklık yarattı.
Bu yüzden, bu torrentin tamamlanmamış bir yedeğini aldım ve dosyalar yerinde, bu yüzden benim fikrim bitmemiş olanın adını kullanmak, bitmiş olanlarla eşleştirmek ve bitmiş olanları tamamlanmamış olan adın yol klasörüne koymaktı. Umarım bu açıktı.
Bunu PowerShell kullanarak çözmeye çalıştım, ancak pek bir şey bilmiyorum, bu yüzden bunu buldum ve hiçbir şey olmuyor, bir şeyler yanlış. Bir çözüm bilen var mı?
$itemlistA = Get-ChildItem -Path "D:\BitTorrent\" | ForEach-Object { $objnameA = $_.Name $objPathA = $_.FullName } $itemlistB = Get-ChildItem -Path "E:\DesiredPath\" -recurse |
ForEach-Object{
$objnameB = $_.Name
$objPathB = $_.FullName
}
ForEach-Object{
if($objnameA -eq $objnameB){
Copy-Item -path $objPathA -Destination $objPathB
Write-Host "ffff Object ($objnameA) new Path ($objPathB) ffff"
}
}
Yanıtlar
Amacınızı doğru anlıyorsam, aşağıdaki komut dosyası, hedefinizin, dosyaları düzleştirilmiş bir dizinden bazı (potansiyel olarak) iç içe dizinlere kopyalamak olduğunu varsayarak hedefinize ulaşacaktır, böylece gelen dosyalar eşleşen adlara sahip dosyaların üzerine yazacaktır.
Yuvalanmış döngülerin O (n ^ 2) performansı, bir sıralama ve daha verimli arama ile iyileştirilebilir.
Kendi ortamınızı yansıtmak için komut dosyasının parametrelerini düzenlemeniz gerekir.
param(
$pathToFiles = "$PSScriptRoot\BitTorrent\",
$desiredPath = "$PSScriptRoot\DesiredPath\"
)
$itemlistA = Get-ChildItem -Path $pathToFiles | Select-Object -Property Name, FullName
$itemlistB = Get-ChildItem -Path $desiredPath -Recurse | Select-Object -Property Name, FullName
foreach ($fileA in $itemlistA) {
foreach ($fileB in $itemListB) {
if ($fileB.Name -eq $fileA.Name) {
Copy-Item -path $fileA.FullName -Destination $fileB.FullName -Verbose
break
}
}
}