darkatohm
Goto Top

Duplikate innerhalb eines Ordners herausfinden trotz unterschiedlicher Dateiendung

Hallo,

ich möchte innerhalb eines Ordners alle Duplikate herausfinden, welche den gleichen Dateinamen haben. Dabei sollen sie aber auch eine unterschiedliche Dateiendung haben können.

Beispiel:

test.txt
test.txt.blub

Kann das jmd z.B. mit einer Batch realisieren?

Content-Key: 318953

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

Ausgedruckt am: 19.03.2024 um 04:03 Uhr

Mitglied: 131223
131223 24.10.2016 aktualisiert um 11:15:21 Uhr
Goto Top
Powershell -Executionpolicy ByPass -Command "gci 'c:\Ordner' -Recurse | ?{!$_.PSIsContainer} | group Basename | ?{$_.Count -gt 1} | %%{$_.Group}"  
Mitglied: Darkatohm
Darkatohm 24.10.2016 um 11:26:24 Uhr
Goto Top
Danke. Wenn ich es mit PowerShell ausführe bekomme ich folgende Meldung:

%% : Die Benennung "%%" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines
ausfhrbaren Programms erkannt. šberprfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist
(sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:100

back-to-top... {!$_.PSIsContainer} | group Basename | ?{$_.Count -gt 1} | %%{$_.Grou ...

back-to-top~~

+ CategoryInfo : ObjectNotFound: (%%:String) , CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException


Kenne mich nicht so gut aus. Ggf. habe ich etwas falsch gemacht. Habe anstatt c:\Ordner den Pfad eingetragen wo die Dateien liegen. Und dann einfach ausgeführt.
Mitglied: 131223
131223 24.10.2016 aktualisiert um 11:30:56 Uhr
Goto Top
Wenn ich es mit PowerShell ausführe bekomme ich folgende Meldung:
Falsch! Das war für die Verwendung innerhalb einer Batchdatei (nicht in der Konsole testen, sondern einer Batchdatei, da Prozentzeichen verdoppelt sind.) gedacht, so wie du es wolltest!

Willst du reines Powershell sieht das so aus
gci 'c:\Ordner' -Recurse | ?{!$_.PSIsContainer} | group Basename | ?{$_.Count -gt 1} | %{$_.Group}  
Mitglied: Darkatohm
Darkatohm 24.10.2016 um 12:00:25 Uhr
Goto Top
Ah ok. Mit Batch ist es besser, da beim Verwendungsort nicht unbedingt Powershell verfügbar ist.

Es hat nur noch nicht ganz wie gewünscht funktioniert. (S. Screenshot)

test2.exe und test2.zip werden z.B. korrekt aufgelistet.


test.txt und test.txt.blub jedoch nicht.

Bekommt man das auch noch hin?
ergebnis2
ergebnis
Mitglied: 131223
131223 24.10.2016 aktualisiert um 12:06:30 Uhr
Goto Top
test.txt und test.txt.blub jedoch nicht.
Logisch weil der Basename bei test.txt.blub ja test.txt ist und die Extension *.blub face-wink

Wenn deine Intention Ransomware ist solltest du dir diesen Thread hier anschauen:
Erpresser Prävention

Bekommt man das auch noch hin?
Kann man wenn man davon ausgeht das keine weiteren Punkte im Dateinamen von Anfang an her, vorkommen.

Ah ok. Mit Batch ist es besser, da beim Verwendungsort nicht unbedingt Powershell verfügbar ist.
Wieder falsch. Hier wird Powershell aus einer Batch aufgerufen, es ist also trotzdem erforderlich.
Mitglied: Darkatohm
Darkatohm 24.10.2016 um 12:45:39 Uhr
Goto Top
Nee meine Intention ist nicht Ransomware. Es geht um ein Scantool und manchmal hängt es sich auf und dann müssen Belege zurückgesetzt werden, damit sie nochmal neu importiert werden.
Das Scantool ergänzt dafür bestimmte Dateiendungen. Daher soll nur auf den Dateinamen, bzw. das war vor dem ersten Punkt steht geschaut werden.

Das Problem ist, dass es dann zwei Belege in einem Status gibt
Z.b.

Beleg.pdf.importing
Beleg.pdf.scanned
Beleg.pdf.imported
Beleg.pdf


Die muss ich herausfinden und das Duplikat löschen.

Ich denke aber es passt schon so, da ja die ersten drei im Beispiel erkannt werden würden.

Gibt es eine Möglichkeit den Ausführungsordner so einzugeben, dass dort gesucht wird wo die Datei liegt und man ihn nicht vorher manuell in die Batch-Datei eingeben muss?
Mitglied: 131223
131223 24.10.2016 aktualisiert um 12:49:04 Uhr
Goto Top
Powershell -Executionpolicy ByPass -Command "gci -Recurse | ?{!$_.PSIsContainer} | group {[regex]::match($_.Name,'(?i)^([^\.]+)(\.[^\.]*\.[^\.]*)?').Groups[1].Value) } | ?{$_.Count -gt 1} | %%{$_.Group}"  
Mitglied: Endoro
Endoro 24.10.2016 aktualisiert um 15:43:21 Uhr
Goto Top
Hey,
Batch code (funktioniert nicht bei Dateien mit Leerzeichen im Dateinamen):
@echo off & setlocal
if not "%~1"=="" cd "%~1"  
for /f "delims==" %%a in ('set . 2^>nul') do set "%%~a="  
for /f "delims=." %%a in ('dir /b/a-d') do set /a .%%~a+=1  
for /f "tokens=1*delims==." %%a in ('set . 2^>nul') do if %%~b neq 1 dir /b/a-d "%%~a*"  

Aufrufparameter ist der zu durchsuchende Ordner.
Gruß, Endoro