Hab die Frage mal an ChatGPT weitergeleiter. Das Ergebnis sieht wie folgt aus, via Powershell Skript:
Das folgende PowerShell-Skript vergleicht Dateien in zwei angegebenen Ordnern anhand ihres Hashes und benennt sie um, wenn sie nicht identisch sind. Wenn die Dateien identisch sind, wird ein Exemplar gelöscht:
Code:
$folder1 = "C:\example\folder1" # Replace with the path to the first folder you want to check
$folder2 = "C:\example\folder2" # Replace with the path to the second folder you want to check
$files1 = Get-ChildItem $folder1 -File
$files2 = Get-ChildItem $folder2 -File
$hashes = @{}
foreach ($file1 in $files1) {
$hash1 = (Get-FileHash $file1.FullName).Hash
$file2 = $files2 | Where-Object {$_.Name -eq $file1.Name}
if ($file2 -ne $null) {
$hash2 = (Get-FileHash $file2.FullName).Hash
if ($hash1 -eq $hash2) {
# If the files are identical, delete one of them
Remove-Item $file2.FullName
} else {
# If the files are not identical, rename one of them
$newName = $file2.FullName + "(1)"
Rename-Item $file2.FullName $newName
}
}
}
Um die Dateien anstatt anhand des Hashes anhand des Datum und der Dateigröße zu vergleichen und die Dateien umzubenennen, können Sie dieses Skript verwenden:
Code:
$folder1 = "C:\example\folder1" # Replace with the path to the first folder you want to check
$folder2 = "C:\example\folder2" # Replace with the path to the second folder you want to check
$files1 = Get-ChildItem $folder1 -File
$files2 = Get-ChildItem $folder2 -File
$hash = @{}
foreach ($file1 in $files1) {
$key1 = $file1.LastWriteTime + "-" + $file1.Length
$file2 = $files2 | Where-Object {$_.Name -eq $file1.Name}
if ($file2 -ne $null) {
$key2 = $file2.LastWriteTime + "-" + $file2.Length
if ($key1 -eq $key2) {
# If the files are identical, delete one of them
Remove-Item $file2.FullName
} else {
# If the files are not identical, rename one of them
$newName = $file2.FullName + "(1)"
Rename-Item $file2.FullName $newName
}
}
}
Habs jetzt nicht getestet, aber bei der Umbenennung müsste man wahrscheinlich noch ansetzen. So wie ich das sehe, würd er aus abc.docx ein abc.docx(1) machen.
Könnte dann so aussehen:
Code:
# If the files are not identical, rename one of them
$newName = $file2.BaseName + "(1)" + $file2.Extension
$newPath = Join-Path $file2.DirectoryName $newName
Rename-Item $file2.FullName $newPath
Es gibt mehrere Möglichkeiten, das oben genannte Skript für mehrere Ordner aufzurufen. Eine Möglichkeit besteht darin, den Pfad der Ordner in eine CSV-Datei zu schreiben und dann das Skript so anzupassen, dass es jede Zeile der CSV-Datei als Ordnerpfad verwendet.
Ein Beispiel für eine CSV-Datei könnte so aussehen:
Code:
C:\example\folder1,C:\example\folder2
C:\example\folder3,C:\example\folder4
Das Skript kann dann so angepasst werden, dass es die CSV-Datei einliest und jede Zeile als Ordnerpfad verwendet:
Code:
$csvFile = "C:\example\folders.csv" # Replace with the path to the CSV file
$folders = Import-Csv -Path $csvFile
foreach ($folderPair in $folders) {
$folder1 = $folderPair.folder1
$folder2 = $folderPair.folder2
$files1 = Get-ChildItem $folder1 -File
$files2 = Get-ChildItem $folder2 -File
$hashes = @{}
# rest of the script stays the same
...
}
Eine andere Möglichkeit besteht darin, das Skript als eine Schleife zu schreiben, die über eine Liste von Ordnern iteriert und das Skript für jeden Ordner aufruft. Eine weitere Möglichkeit wäre ein Skript mit einer Argumentenliste, welche die Ordner enthält und die Schleife durch die Argumentenliste iteriert und das Skript für jeden Ordner aufruft.
Wichtig ist, dass Sie sicherstellen, dass das Skript für jeden Ordner aufgerufen wird und dass es keine Überschneidungen mit bereits bearbeiteten Ordnern gibt, um sicherzustellen, dass die Dateien korrekt verarbeitet werden.