Batch Datei sichern und alte Dateien löschen

ghost55

Newbie
Registriert
März 2018
Beiträge
3
Hallo Liebe Leute,

ich stehe vor folgender Herausforderung:

Ich habe in einem Verzeichnis mehrere Dateien die vom Dateinamen her so aussehen: Text1_Text2_2018.03.12_13.39.xml
In Text1 und Text2 steht immer der gleiche Text und danach kommt Datum und Uhrzeit.
Das sind sozusagen Backup-Dateien die täglich durch eine Software angelegt werden.
Die Hauptdatei aus denen die Backups stammen, sieht dann so aus: Text1_Main_Text2.xml
Aktuell lösche ich diese Backup-Dateien alle paar Wochen manuell damit sie nicht zuviel werden.
Weil das nicht nur ein einziges Verzeichnis ist, kostet mich das immer einiges an Zeit. Deswegen würde ich dies gerne automatisieren durch bspw. eine Batch-Datei.
Wichtig dabei ist dass die Hauptdatei zuerst gesichert wird. Dafür erst kopieren und dann umbenennen so wie die Backupdateien heissen und natürlich mit aktuellem Timestamp. Also quasi das "Main" aus der Mitte weg und hintendran ein Timestamp (Fragt mich bitte nicht warum das "Main" unbedingt weg muss, ich weiss es nämlich auch nicht). Anschliessend können alle anderen Dateien die "Text1_Text2_*" heissen, gelöscht werden, außer der eine der grad erstellt wurde.

Ich hab leider sehr wenig Ahnung von Batch-Programmierung und mit Google Suche bin ich auch nicht weiter gekommen.
Ich hoffe jmd kann mir dabei helfen.


Vielen Dank und Gruss.
 
So würde es die Dateien mit main herausnehmen & den Rest löschen. Reicht das auch? Ggf. müsste die zweite Move-Zeile um eine FOR-Schleife erweitert werden
Code:
 @echo off 
REM Temp Ordner anlegen 
mkdir %~dp0temp  

REM alle xml mit main im Dateinamen nach TEMP-Ordner verschieben 
move /Y *main*.xml %~dp0temp   

REM die restlichen xml löschen 
del /F *.xml  

REM main-xml wieder aus TEMP-Ordner verschieben 
move /Y %~dp0temp\*main*.xml %~dp0  

REM Temp-Ordner löschen 
rd %~dp0temp
 
Zuletzt bearbeitet:
PowerShell (also als .ps1 Skript speichern und ggf. ExecutionPolicy ändern)

Grundlage habe ich nach 5 Sekunden googlen hier und hier gefunden.

Kopiert die Datei $fileName, entfernt das "_Main" und hängt hinten dran Datum und Uhrzeit.
Der untere Part löscht alle Dateien die älter als 30 Tage ($Daysback) sind im Verzeichnis $Path, aber keine Ordner/Unterordner. Musst halt schauen ob das so für dich passt.

Code:
$fileName = "C:\Pfad\Text1_Main_Text2.xml"
$Path = "C:\Backups\"

if (Test-Path $fileName)
{
 $file   = [io.path]::GetFileNameWithoutExtension($fileName)
 $ext    = [io.path]::GetExtension($fileName)
 $Target = $Path + ($file -replace "_Main", "") + "_" + $(get-date -f yyyy.MM.dd_hh.mm.ss) + $ext
 Copy-Item $fileName $Target
} 
else 
{
 Write-Host "Datei existiert nicht"
}

$Daysback = "-30"
$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
Get-ChildItem $Path | Where-Object { $_.CreationTime -lt $DatetoDelete } | Remove-Item -Force
 
Zuletzt bearbeitet:
Ja, ist ein Batch bzw Powershell problem (Powershell > Batch)

Wer aber sowas nicht googelnk ann sondern stattdessen hier in dem Forum sich anmeldet um ein "Please write this for me" zu schreiben sollte m.E. entweder einen Kurs belegen oder sich sowas von jemandem der Ahnung hat bauen lassen. Sowas kostet ja nicht die Welt und vermutlich wäre die nächste Frage wie man denn die Execution Policy nun ändert.
 
Habe es mal als Powershell geschrieben.

Script kopiert die Datei mit Datum und Uhrzeit am Ende, entfernt das Main egal wo es steht bei der neuen Datei und entfernt dann alle Dateien die kein Main haben oder älter sind als die gerade erstellten.

Du musst nur ganz oben den Pfad anpassen auf deinen Ordner.

Code:
$mainDir = 'C:\Test'
cd $mainDir
$datetime = Get-Date -UFormat "%Y.%m.%d_%H.%M"
$folder = dir
foreach ($element in $folder) {
    if($element.Name.Contains("Main")) {
        $newFileName = $element.Name -replace("_Main", "") -replace (".xml", "")
        $newFileName += "_" + $datetime + ".xml"
        Copy-Item $element.Name "$newFileName"
    }
}
Remove-Item -Path "$mainDir\*" -Exclude *Main*,*$datetime*

@pizza4ever
Nicht jeder braucht oft ein Skript, und für etwas einmaliges finde ich nicht das man es extra lernen muss. Auch ist es oft für einen der nicht drin ist im Thema nicht so trivial direkt eins zu schreiben finde ich.
 
pizza4ever schrieb:
und vermutlich wäre die nächste Frage wie man denn die Execution Policy nun ändert.

Was ich absichtlich nicht beantwortet habe.
Ich verstehe schon, dass wenn man keine Ahnung hat es schwierig ist sich einen "Google Fund" anzupassen. Aber etwas Eigeninitiative kann man schon erwarten ;)
 
Hallo Ic3Hands,

nachdem ich die ExecutionPolicy auf unrestricted geändert habe, funktioniert es genau wie wollte.
Tolle Arbeit danke!

Ich wollte den Script jetzt noch etwas erweitern für den Fall das es verschiedene Dateinamen in dem Verzeichnis geben könnte.
Die habe ich in die If-Anweisung so eingebaut:
Code:
if($element.Name.Contains("Text1") -or $element.Name.Contains("Text2") -or $element.Name.Contains("Text3"))

Dann müssen natürlich auch mehrere Dateien mit verschiedenen Dateinamen gelöscht werden. Das habe ich so versucht:
Code:
Remove-Item -Path "$mainDir\Text1*" -Exclude *Main*,*$datetime*
Remove-Item -Path "$mainDir\Text2*" -Exclude *Main*,*$datetime*
Remove-Item -Path "$mainDir\Text3*" -Exclude *Main*,*$datetime*
und auch so:
Code:
Remove-Item -Path "$mainDir\Text1*", "$mainDir\Text2*", "$mainDir\Text3*" -Exclude *Main*,*$datetime*
Mit der If-bedingung funktioniert es wie gewollt. Die Main-Dateien werden kopiert, umbenannt und mit einem Timestamp versehen.
Aber das Löschen funktioniert nicht. Was mach ich da noch falsch?
 
Zuletzt bearbeitet:
Er sucht nach entsprechenden Ordnern so wie du das gemacht hast. Du musst nur das Exclude anpassen, mein Löschbefehl löscht Grundsätzlich alles außer den Dateien die durch das Exclude ausgeschlossen werden.
 
Hallo Pizza4ever,

danke genauso wollte ich es haben!

Musste nichts mehr anpassen.
 
Zurück
Oben