philzip
Goto Top

Per Skript nach Datei-Duplikaten scannen (Powershell)

Hallo zusammen,

ich hatte die Anfrage vor einigen Wochen/Monaten schonmal gestellt, dort kam ich allerdings nicht so richtig weiter.

Daher bitte ich an dieser Stelle nochmal um eure Hilfe.

Folgendes Szenario.

Im Ordner C:\Daten\ sind ca. 100 Ordner. Darunter auch der Unterordner "ORIGINAL".

Im Ordner "ORIGINAL" sind wichtige Dokumente, die immer auf dem aktuellen Stand gehalten werden müssen. Daher ist nicht gewünscht, dass es vom Inhalt des Ordners Dupliakte innerhalb von C:\Daten gibt.

Ich würde gerne ein Skript erstellen, welches dies prüft und das Ergebnis in eine Text- oder CSV-Datei schreibt.

Kurze Zusammenfassung der Anforderungen:

Schritt 1: Alle Dateien in C:\Daten\ORIGINAL erfassen
Schritt 2: In C:\Daten (inkl. allen Unterordnern außer ORIGINAL) nach Duplikaten der aus in Schritt 1 gefundenen Dateien suchen
Schritt 3: Ergebnis in Datei schreiben und abspeichern

Vielen lieben Dank im Voraus!

LG Philzip

Content-ID: 289967

Url: https://administrator.de/contentid/289967

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

H41mSh1C0R
H41mSh1C0R 03.12.2015 aktualisiert um 09:55:47 Uhr
Goto Top
Servus Philzip,

Punkt 1 und 2 nach 1 Minute (der 2te Link von oben):
http://lmgtfy.com/?q=powershell+duplicate+files

Punkt 3:

Was willst du genau als Ergebnis schreiben/abspeichern??

Gruß
Philzip
Philzip 03.12.2015 um 10:38:08 Uhr
Goto Top
Na die Liste der gefundenen Duplikate face-smile
TlBERlUS
TlBERlUS 03.12.2015 aktualisiert um 10:59:27 Uhr
Goto Top
Moin,

clear-host
$path = "C:\test"  
$original = gci "$path\Original"  
$original | out-file $path\Report\originfiles.txt -Append

 foreach($o in $original){
    $search = Test-Path $path\$o
    if ($search-eq $true){
    "$o wurde in $path gefunden" | Out-File $path\Report\Duplikates.txt -Append  
    }
  }

Edit: Überarbeitet
colinardo
Lösung colinardo 03.12.2015, aktualisiert am 08.12.2015 um 17:12:23 Uhr
Goto Top
Hallo zusammen,
Na die Liste der gefundenen Duplikate
das Wort Duplikat kann vielfältig sein und ist so ohne Definition ziemlich schwammig, denn jeder kann darunter etwas anderes definieren. Wenn du mit Duplikaten meinst das Dateiname, Änderungsdatum und Größe übereinstimmen sollen, dann kannst du du das folgendermaßen machen:
# Root Ordner
$root = 'C:\Daten'  
# Ordner der die Referenzdateien enthält
$referencefolder = 'C:\Daten\ORIGINAL'  
# Referenzdateien speichern
$reference = gci $referencefolder -Recurse | ?{!$_.PSISContainer}
# alle anderen Files außer dem Originalordner speichern
$other = gci $root -Recurse | ?{!$_.PSISContainer -and $_.Directory.FullName -notlike "$referencefolder*"}  
# Vergleiche und schreibe nur Dateien welche in Name, Änderungsdatum und Größe übereinstimmen in eine Datei
compare $other $reference -Property Name,LastWriteTime,Length-PassThru -IncludeEqual -ExcludeDifferent | select -Expand Fullname | out-file 'C:\duplicates.txt'  
Möchtest du zusätzlich den Inhalt also den Hash der Files vergleichen, dann habe ich hier schon mal ein Skript gepostet das sowas macht.
Dupes mit anderem Dateinamen finden und in "HardLinks" umwandeln (W2k12R2, NTFS)

Grüße Uwe

-edit- kleine Korrektur
Philzip
Philzip 03.12.2015 um 12:04:53 Uhr
Goto Top
Zitat von @TlBERlUS:

Moin,

> clear-host
> $path = "C:\test"  
> $original = gci "$path\Original"  
> $original | out-file $path\Report\originfiles.txt -Append
> 
>  foreach($o in $original){
>     $search = Test-Path $path\$o
>     if ($search-eq $true){
>     "$o wurde in $path gefunden" | Out-File $path\Report\Duplikates.txt -Append  
>     }
>   }
> 
> 

Edit: Überarbeitet

Hi, zunächst vielen Dank! Leider bekomme ich jedoch nur die Duplikate angezeigt, die direkt in C:\test liegen, nicht z.B. die in C:\test\unterordner1.

Lässt sich da noch was machen?
Philzip
Philzip 03.12.2015 um 12:07:05 Uhr
Goto Top
Zitat von @colinardo:

Hallo zusammen,
Na die Liste der gefundenen Duplikate
das Wort Duplikat kann vielfältig sein und ist so ohne Definition ziemlich schwammig, denn jeder kann darunter etwas anderes definieren. Wenn du mit Duplikaten meinst das Dateiname, Änderungsdatum und Größe übereinstimmen sollen, dann kannst du du das folgendermaßen machen:
> # Root Ordner
> $root = 'C:\Daten'  
> # Ordner der die Referenzdateien enthält
> $referencefolder = 'C:\Daten\ORIGINAL'  
> # Referenzdateien speichern
> $reference = gci $referencefolder -Recurse | ?{!$_.PSISContainer}
> # alle anderen Files außer dem Originalordner speichern
> $other = gci $root -Recurse | ?{!$_.PSISContainer -and $_.Directory.FullName -ne $referencefolder}
> # Vergleiche und schreibe nur Dateien welche in Name, Änderungsdatum und Größe übereinstimmen in eine Datei
> compare $other $reference -Property Name,LastWriteTime,Size -PassThru -IncludeEqual -ExcludeDifferent | ft Fullname,LastWriteTime,Length -Autosize | out-file 'C:\duplicates.txt'  
> 
Möchtest du zusätzlich den Inhalt also den Hash der Files vergleichen, dann habe ich hier schon mal ein Skript gepostet das sowas macht.
Dupes mit anderem Dateinamen finden und in "HardLinks" umwandeln (W2k12R2, NTFS)

Grüße Uwe

-edit- kleine Korrektur

Hallo Uwe,

danke, das probiere ich aus! Zunächst reicht es sogar, wenn nur der Name 100% übereinstimmt.
colinardo
Lösung colinardo 03.12.2015 aktualisiert um 12:55:07 Uhr
Goto Top
Zitat von @Philzip:
Zunächst reicht es sogar, wenn nur der Name 100% übereinstimmt.
Wenn das ausreicht ändere die letzte Zeile so ab, dann wird nur der Name als Vergleich herangezogen.
compare $other $reference -Property Name -PassThru -IncludeEqual -ExcludeDifferent | select -Expand Fullname | out-file 'C:\duplicates.txt'
Philzip
Philzip 03.12.2015 um 12:18:35 Uhr
Goto Top
Zitat von @colinardo:

Zitat von @Philzip:
Zunächst reicht es sogar, wenn nur der Name 100% übereinstimmt.
Wenn das ausreicht ändere die letzte Zeile so ab, dann wird nur der Name als Vergleich herangezogen.
> compare $other $reference -Property Name -PassThru -IncludeEqual -ExcludeDifferent | select -Expand Fullname | out-file 'C:\duplicates.txt'
> 

Habe dein Skript gerade getestet. Sieht super aus, habe aber noch ein Thema:

In der Duplicates.txt werden mir auch Dateien angezeigt, die in c:\Daten\Original\Unterordner liegen. Als Referenzdaten sollen allerdings alle Daten in Original INKL allen Unterordnern von Original genommen werden. Ist das machbar?
colinardo
Lösung colinardo 03.12.2015 aktualisiert um 12:55:05 Uhr
Goto Top
Zitat von @Philzip:
In der Duplicates.txt werden mir auch Dateien angezeigt, die in c:\Daten\Original\Unterordner liegen. Als Referenzdaten sollen allerdings alle Daten in Original INKL allen Unterordnern von Original genommen werden. Ist das machbar?
kein Problem, ist angepasst ...
Philzip
Philzip 03.12.2015 um 12:29:45 Uhr
Goto Top
Zitat von @colinardo:

Zitat von @Philzip:
In der Duplicates.txt werden mir auch Dateien angezeigt, die in c:\Daten\Original\Unterordner liegen. Als Referenzdaten sollen allerdings alle Daten in Original INKL allen Unterordnern von Original genommen werden. Ist das machbar?
kein Problem, ist angepasst ...

Leider unverändert, es stehen immer noch Dokumente aus C:\Daten\Original\Unterordner in der Textdatei. So sieht mein Skript nun aus:

$root = 'C:\Daten'
$referencefolder = 'C:\Daten\ORIGINAL'
$reference = gci $referencefolder -Recurse | ?{!$_.PSISContainer}
$other = gci $root -Recurse | ?{!$_.PSISContainer -and $_.Directory.FullName -notlike $referencefolder}
compare $other $reference -Property Name -PassThru -IncludeEqual -ExcludeDifferent | select -Expand Fullname | out-file 'C:\duplicates.txt'
colinardo
Lösung colinardo 03.12.2015 aktualisiert um 12:55:03 Uhr
Goto Top
Du hast es falsch kopiert, du siehst ja das dir da einiges an Zeichen im Where-Object-Filter fehlt !! Läuft hier einwandfrei, ich poste hier ja nichts, was ich nicht vorher getestet habe!
Philzip
Philzip 03.12.2015 aktualisiert um 12:37:28 Uhr
Goto Top
Zitat von @colinardo:

Du hast es falsch kopiert, du siehst ja das dir da einiges an Zeichen im Where-Object-Filter fehlt !! Läuft hier einwandfrei, ich poste hier ja nichts, was ich nicht vorher getestet habe!

Sorry, ich blicks nicht.
colinardo
Lösung colinardo 03.12.2015 aktualisiert um 12:55:01 Uhr
Goto Top
Zitat von @Philzip:
Sorry, ich blicks nicht.
Code von oben richtig kopieren, dann klappts !
Philzip
Philzip 03.12.2015 um 12:54:59 Uhr
Goto Top
Zitat von @colinardo:

Zitat von @Philzip:
Sorry, ich blicks nicht.
Code von oben richtig kopieren, dann klappts !

Sehe den Fehler immer noch nicht, aber nach erneutem Kopieren klappt's face-smile Ich danke dir
colinardo
colinardo 03.12.2015 aktualisiert um 13:04:01 Uhr
Goto Top
Sehe den Fehler immer noch nicht
Du hattest das hier gepostet:
-notlike $referencefolder}
es muss aber
-notlike "$referencefolder*"}
lauten face-wink

Ich danke dir
Bitte, keine Ursache.

Grüße Uwe
Philzip
Philzip 03.12.2015 um 16:58:00 Uhr
Goto Top
Zitat von @colinardo:

Sehe den Fehler immer noch nicht
Du hattest das hier gepostet:
-notlike $referencefolder}
es muss aber
> -notlike "$referencefolder*"}
> 
lauten face-wink

Ich danke dir
Bitte, keine Ursache.

Grüße Uwe

Hallo nochmal Uwe,

das Skript ist nun durchgelaufen. Leider ist das Ergebnis unbefriedigend.

Die Pfade sind alle ziemlich lang und werden in der Textdatei gar nicht komplett dargestellt.

Sieht dann ungefährt so aus:

C:\Daten\abc.doc
C:\Daten\unterordner1\unterordner2\abcdef.docx
C:\Daten\unterordner1\unterordner2\unterordner3\unte...
C:\Daten\unterordner1\unterordner2\unterordner3\unte...
C:\Daten\unterordner1\unterordner2\unterordner3\unte...
C:\Daten\unterordner1\unterordner2\unterordner3\unte...

Kann man da was machen, dass auch lange Pfade komplett angezeigt werden?
colinardo
colinardo 03.12.2015 um 17:05:21 Uhr
Goto Top
Ist doch kein Beinbruch ... Oben angepasst ...