spezpibat
Goto Top

Relikte einer leicht fehlerhaften Wiederherstellung entfernen per Skript

An alle Helfer, ich würde ein Skript zur Bereinigung von Dateien benötigen.
Die Dateinamen haben eine recht spezielles Muster, daher die Anfrage.

Kurze Vorgeschichte:

Nach einem Hardwareausfall musste ein Backup wieder auf den reparierten Server gespielt werden. Einige Zeit nach dieser Wiederherstellung finde ich nun in immer mehr Ordnern einige Relikte dieser Wiederherstellung.
Damit ist gemeint das in einigen Ordnern Dateien doppelt auftauchen.
Jedoch nicht im eigentlich Sinne doppelt.

richtige Datei:
Dateiname.doc
temporäre (aber noch vorhandene) Datei von Acronis:
Q8MV48DC~Dateiname.doc~

Diese temporären Dateien tauchen unabhängig vom Dateityp (Word, Excel, Jpeg, etc, ...) auf.
In der Masse gerechnet macht das ein ganze Menge temporäre Dateien die eine Menge Speicherplatz fressen aus.

Daher würde ich ein Skript benötigen, welches nach Möglichkeiten mit den Bordmitteln von W2k8 R1 eben diese Dateien findet und löscht.

Grundlegend sollte es so funktionieren:

1. Muster-Suche:
[ALPHANUM]{8,8}~[*]{1,}.DATEIENDUNG~

2. wenn Treffer, dann suche im selben Verzeichnis nach:
[*]{1,}.DATEIENDUNG

3. wenn 1. und 2. Treffer ergeben hat, lösche die Datei die 1. matcht


Da ich mit den Konsolen-Möglichkeiten in Windows nicht so sonderlich erfahren bin, wäre ich für jeden Lösungsansatz und jede Hilfe bei der Skript-Erstellung dankbar.


MfG SpezPiBat

Content-ID: 204044

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

Ausgedruckt am: 26.11.2024 um 01:11 Uhr

bastla
bastla 27.03.2013, aktualisiert am 03.04.2013 um 16:17:38 Uhr
Goto Top
Hallo spezpibat!

Mit einer ewas weniger restriktiven Suche nach "*~*.*~" könnte das etwa so gehen:
@echo off & setlocal
set "Basis=D:\Testordner"  
set "Maske=*~*.*~"  
set "Log=D:\Log.txt"  
set "Delim=	"  

del "%Log%" 2>nul  
for /f "delims=" %%i in ('dir /s/b/a-d "%Basis%\%Maske%" 2^>nul') do (  
    for /f "tokens=2 delims=~" %%a in ("%%~nxi") do if exist "%%~dpi%%a" >>"%Log%" echo "%%i"%Delim%"%%a"  
)
Es wird zunächst nur eine Liste (in "D:\Log.txt") aller "passenden" Dateien erstellt. Das in Zeile 5 festgelegte Trennzeichen ist TAB - damit kann diese Liste zB leicht zur Kontrolle in Excel importiert bzw in weiterer Folge mit einem zweiten Batch für das Löschen der unnötigen Dateien verwendet werden.

Falls nicht nur ein Ordner, sondern eine gesamte Partition untersucht werden soll, müssste für zB Laufwerk "E:" die Zeile 2 so
set "Basis=E:"
- also ohne abschließenden "\" - geschrieben werden.

Grüße
bastla
spezpibat
spezpibat 03.04.2013 aktualisiert um 10:13:12 Uhr
Goto Top
Vielen Dank bastla.

Heute bin ich mal dazu kommen das ganze probehalber durchlaufen zu lassen.
Die "Unschärfe" des RegEx ist wahrscheinlich nicht weiter schlimm, da die Wahrscheinlichkeit niedrig ist, dass ein Nutzer irgendwann mal eine Datei so benannt hat, dass das Muster darauf zutreffen könnte.

Allerdings habe ich beim überfliegen der Ergebnisse das gute alte Umlaut-Problem erkannt.

So wird beispielsweise
1F7UK115~Hochwasserschäden.xls~ in der Logdatei zu 1F7UK115~Hochwassersch„den.xls~
oder
R4H078QR~Aufmaß.pdf~ zu R4H078QR~Aufmaá.pdf~

Kennst du auch dafür eine Lösung?

Wie könnte denn die weitere Verwendung der Logdatei aussehen?
Ich habe zugegebener Maßen mit Batch-Dateien noch nicht viel gescripted, bin aber durchaus daran interessiert meine Kenntnisse in dieser Hinsicht zu erweitern.
Anders als eine Manpage unter Linux gibt allerdings die Hilfe unter Windows leider nicht viel her.
bastla
bastla 03.04.2013 um 16:17:13 Uhr
Goto Top
Hallo spezibat!

Hinsichtlich der Umlaute könntest Du zwar vorweg auf die Codepage 1252 umschalten - also etwa
@echo off & setlocal
set "Basis=D:\Testordner"  
set "Maske=*~*.*~"  
set "Log=D:\Log.txt"  
set "Delim=	"  

for /f "tokens=2 delims=:." %%i in ('chcp') do set /a CP=%%i  
chcp 1252 >nul

del "%Log%" 2>nul  
for /f "delims=" %%i in ('dir /s/b/a-d "%Basis%\%Maske%" 2^>nul') do (  
    for /f "tokens=2 delims=~" %%a in ("%%~nxi") do if exist "%%~dpi%%a" >>"%Log%" echo "%%i"%Delim%"%%a"  
)
chcp %CP% >nul
- allerdings sollen die Inhalte der "Log.txt" ohnehin wieder per Batch weiter verarbeitet (also vermutlich gelöscht) werden, sodass sich die Diskrepanz ASCII vs ANSI gar nicht auswirken würde ...
Wie könnte denn die weitere Verwendung der Logdatei aussehen?
Wenn Du nur stumpf alle in der "Log.txt" aufgelisteten Dateien löschen wolltest, würde eine Zeile der Art
for /f "delims=	" %%i in (D:\Log.txt) do echo del "%%i"
genügen - das "echo" vor dem "del" simuliert dabei zunächst das Löschen, indem der entsprechende Befehl nur angezeigt wird.

Grüße
bastla