Bagaimana cara membedakan dua folder di Windows Powershell?
11
Saya mencoba untuk menemukan perbedaan dalam isi dua struktur folder menggunakan Windows Powershell. Saya telah menggunakan metode berikut untuk memastikan bahwa nama file sama, tetapi metode ini tidak memberi tahu saya jika isi file sama:
Teknik yang dijelaskan dalam pertanyaan ServerFault ini berfungsi untuk membedakan satu file, tetapi folder ini berisi ratusan file pada berbagai kedalaman.
Solusinya tidak perlu memberi tahu saya apa yang spesifik dalam file berbeda - hanya itu saja. Saya tidak tertarik pada perbedaan metadata seperti tanggal, yang saya tahu berbeda.
Jika Anda ingin membungkus bandingkan menjadi satu lingkaran saya akan mengambil pendekatan berikut:
$folder1 ="C:\Users\jscott"
$folder2 ="C:\Users\public"# Get all files under $folder1, filter out directories
$firstFolder =Get-ChildItem-Recurse $folder1 |Where-Object{-not $_.PsIsContainer}
$firstFolder |ForEach-Object{# Check if the file, from $folder1, exists with the same path under $folder2If(Test-Path( $_.FullName.Replace($folder1, $folder2))){# Compare the contents of the two files...If(Compare-Object(Get-Content $_.FullName)(Get-Content $_.FullName.Replace($folder1, $folder2))){# List the paths of the files containing diffs
$_.FullName
$_.FullName.Replace($folder1, $folder2)}}}
Perhatikan bahwa ini akan mengabaikan file yang tidak ada di keduanya$folder1 dan $folder2.
Saya telah mengambil jawaban jscott yang diperluas untuk menampilkan file yang ada dalam satu tetapi tidak yang lain bagi mereka yang insterest dalam jenis fungsi tersebut. Harap dicatat juga menunjukkan kemajuan yang dibuat karena sulit bagi saya untuk melihat bahwa mengingat folder besar dengan perbedaan yang tidak terlalu banyak. Sepertinya skrip digantung kepada saya. Berikut adalah kode PowerShell untuk itu:
$folder1 ="C:\Folder1"
$folder2 ="C:\Folder2"# Get all files under $folder1, filter out directories
$firstFolder =Get-ChildItem-Recurse $folder1 |Where-Object{-not $_.PsIsContainer}
$failedCount =0
$i =0
$totalCount = $firstFolder.Count
$firstFolder |ForEach-Object{
$i = $i +1Write-Progress-Activity"Searching Files"-status "Searching File $i of $totalCount"-percentComplete ($i / $firstFolder.Count*100)# Check if the file, from $folder1, exists with the same path under $folder2If(Test-Path( $_.FullName.Replace($folder1, $folder2))){# Compare the contents of the two files...If(Compare-Object(Get-Content $_.FullName)(Get-Content $_.FullName.Replace($folder1, $folder2))){# List the paths of the files containing diffs
$fileSuffix = $_.FullName.TrimStart($folder1)
$failedCount = $failedCount +1Write-Host"$fileSuffix is on each server, but does not match"}}
else
{
$fileSuffix = $_.FullName.TrimStart($folder1)
$failedCount = $failedCount +1Write-Host"$fileSuffix is only in folder 1"}}
$secondFolder =Get-ChildItem-Recurse $folder2 |Where-Object{-not $_.PsIsContainer}
$i =0
$totalCount = $secondFolder.Count
$secondFolder |ForEach-Object{
$i = $i +1Write-Progress-Activity"Searching for files only on second folder"-status "Searching File $i of $totalCount"-percentComplete ($i / $secondFolder.Count*100)# Check if the file, from $folder2, exists with the same path under $folder1If(!(Test-Path($_.FullName.Replace($folder2, $folder1)))){
$fileSuffix = $_.FullName.TrimStart($folder2)
$failedCount = $failedCount +1Write-Host"$fileSuffix is only in folder 2"}}
Anda cukup membungkus lingkaran di sekitar jawaban yang benar dari pertanyaan Anda yang terhubung yang sudah menjawab ini, dan berjalan di pohon direktori membandingkan setiap file dengan nama yang sama.
/ Sunting: Jika itu sebenarnya pertanyaan Anda, itu lebih sesuai untuk SO, di mana Anda tampaknya menjadi kontributor tetap. Anda mengajukan pertanyaan pemrograman. Saya mengerti Anda melakukannya untuk tujuan sysadmin, dalam hal ini, saya akan memberitahu Anda untuk menggunakan alat yang dibuat khusus seperti WinDiff.
Oke, situs ini tidak sesuai untuk pertanyaan jenis "Beri aku kodez". Jika Anda perlu memulai mempelajari cara melakukan loop di Powershell, beli buku atau temukan tutorial online; ada banyak.
mfinni
2
Saya pikir Anda bangun di sisi tempat tidur yang salah. Saya bukan pengguna Powershell biasa. Saya telah menunjukkan dalam pertanyaan saya teknik yang sedang saya coba, dan tautan ke pertanyaan yang memiliki informasi bermanfaat tambahan untuk masalah saya. Saya tidak tahu bagaimana menggabungkan kedua teknik, yang merupakan masalah saya, dan alasan saya mengajukan pertanyaan ini. Ini juga merupakan pertanyaan yang saya tidak dapat jawab menggunakan pencarian Google. Jika Anda tidak akan membantu, silakan pertimbangkan untuk menghapus jawaban Anda.
@ voretaq7 Saya pikir kalian salah mengerti saya sebagai pengguna PowerShell. Saya melakukan pencarian google, mencoba teknik itu, dan tidak berhasil. Saya mencoba menjelaskan di mana saya berada dalam pertanyaan di atas. Pertanyaan yang Anda tautkan berfungsi pada satu set file. Saya memiliki dua set yang harus saya bandingkan, nama-ke-nama. Aku benar-benar tidak berusaha menjadi malas di sini. Saya tahu cara mengulang, dan saya tahu cara membandingkan. Bagaimana cara mengulang, dan membandingkan dua set?
David Smith
1
Saya pikir melakukan ini dengan PS adalah proyek kecil yang hebat. Namun, WinMerge (mengira itu adalah WinDiff, konyol saya) benar-benar alat yang hebat jika Anda akan melakukan ini sangat sering. Ini benar-benar dibangun untuk pekerjaan itu. Cobalah, unduhannya gratis. Itu punya pengurai untuk sebagian besar jenis file, dan melakukan pekerjaan yang baik untuk menyoroti, termasuk opsi untuk bagaimana Anda ingin menangani spasi putih.
Anda cukup membungkus lingkaran di sekitar jawaban yang benar dari pertanyaan Anda yang terhubung yang sudah menjawab ini, dan berjalan di pohon direktori membandingkan setiap file dengan nama yang sama.
/ Sunting: Jika itu sebenarnya pertanyaan Anda, itu lebih sesuai untuk SO, di mana Anda tampaknya menjadi kontributor tetap. Anda mengajukan pertanyaan pemrograman. Saya mengerti Anda melakukannya untuk tujuan sysadmin, dalam hal ini, saya akan memberitahu Anda untuk menggunakan alat yang dibuat khusus seperti WinDiff.
sumber
PowerShell loop through files
di Google . ayo sekarang - sedikit usaha di pihak Anda?Melakukan hal ini:
Dan bahkan secara rekursif:
dan bahkan sulit untuk dilupakan :)
sumber