Hey Leute,
ich bin mal wieder auf eure Hilfe angewiesen!
Ich habe vor längerer Zeit ein Skript geschrieben das alte Backups löschen
sollte.
Das klappt auch auf mehreren Server Problemlos, neuerdings bekomme ich
allerdings auf einem Server die Fehlermeldung
Error: Subscript used with non-Array variable
[Blockierte Grafik: http://www.autoit.de/index.php?page=Attachment&attachmentID=16270&h=8c2a4ebd41f7b5474443172ff24435846b409ed0]
Sowohl an dem Server als auch in dem Skript und der Ini habe ich nichts
geändert.
Die Dateien die vom Skript überprüft werden sollen liegen auch alle in den
Ordnern in denen das Skript sie sucht.
Ausgeführt wird das Skript als Administrator, daher sollte es auch genug Rechte
haben (hat ja auch mehrere Wochen gelaufen).
Hier der Quellcode:
Spoiler anzeigen
#cs*****************************************
;Löschen_alter_Dateien.au3 by GorePriest
;Erstellt mit ISN AutoIt Studio v. 0.76 BETA#
Löschen_alter_Backups - Version 0.1 Stand 26.01.2012
- Das Script holt sich verschiedene Variablen aus einer Ini
- Es Überprüft alle Dateien eines Bestimmten Types in einem Pfad auf Ihr alter
- Wenn Eine Datei vom aktuellen Datum im Ordner liegt löscht es alle Dateien älter als X Tage
- Eine Log Datei wird erstellt in der alle gelöschten Dateien stehen
- Wenn keine Datei vom aktuellen Datum om Ordner liegt bricht das Script ab und schickt eine E-Mail Warnung
Löschen_alter_Backups - Version 0.1.1 Stand 31.01.2012
Neue Funktionen / Bugfixes
- Überprüfung der aktuellsten Datei wurde verbessert
- Falls keine Aktuelle Datei vorhanden ist werden jetzt alle Dateien die X Tage älter als die aktuellste Datei sind gelöscht
- In Der Ini Datei kann jetzt angeben werden ob das Backup am Vorabend oder am selben Tag vor durchlauf des Script durchgeführt wird
- Ein Debug modus wurde hinzugefügt
Löschen_alter_Backups - Version 0.1.2 Stand 07.02.2012
Neue Funktionen / Bugfixes
- Es wird überprüft ob die .ini Datei am gewünschen Pfad existiert, Falls nicht wird sie erstellt und der User wird aufgefordert sie anzupassen.
- Der Ort an dem die Logs abgelegt werden wir jetzt auch aus der ini ausgelesen auf die Art kann das Script einfacher an verschieden Server angepasst werden.
#ce*****************************************
#include <Array.au3>
#include <Date.au3>
#include <File.au3>
#include <inet.au3>
;Überprüft ob die Ini Datei vorhanen ist, falls nicht wird eine Ini Datei mit Standard werden abgelegt und der User wird aufgefordert die Datei anzupassen.
If FileExists(@ScriptDir & "\loeschen_alter_backups.ini") = 0 Then
FileInstall("U:\Scripte\Projekte\Loeschen_alter_Dateien\loeschen_alter_backups.ini",@ScriptDir & "\loeschen_alter_backups.ini",0)
MsgBox(0,"Bitte die Ini Datei Anpassen!", "Es wurde eine neue Ini Datei erstellt, bitte passen Sie die Werte nach Bedarf an!" & @CRLF & "Die Datei liegt unter " & @ScriptDir & @CRLF & "Sie heisst loeschen_alter_backups.ini" & @CRLF & "Führen Sie das Programm im Anschluss noch einmal aus.")
Run(@ScriptDir & "\loeschen_alter_backups.ini")
Exit
EndIf
;Erstellen eines Zeitstempels
const $Stamp = @YEAR & @MON & @MDAY
;Einlesen der Uhrzeit
;~ const $Time = @HOUR & @MIN & @SEC
;Ini Datei
const $Iniverzeichnis = @ScriptDir
const $IniName = "loeschen_alter_backups.ini"
const $Ini = $Iniverzeichnis & "\" & $IniName
;Log Name
const $LogName = "Log" & $Stamp & ".txt"
;Log Ordner
const $LogOrdner =IniRead($Ini,"anzahl","LogOrdner","C:\Temp")
;Anzahl der druchläufe (wird aus einer Ini Datei ausgelesen)
const $Anzahl =IniRead($Ini,"anzahl","anzahl","")
;Wenn DB = 1 werden MsgBoxen aktiv um den reibungslosen ablauf zu überprüfen (wird aus einer Ini Datei ausgelesen)
const $DB =IniRead($Ini,"anzahl","DB","")
;Varialblen zum versenden einer E-Mail
$Hostname = @ComputerName
; Adresse des Smtp Server der genutzt werden soll
$SmtpServer = IniRead($Ini,"anzahl","SMTP_SVR","")
; Name das Absenders
$FromName = $Hostname
; E-Mail Adresse die als Absender angezeigt wird
$FromAddress = IniRead($Ini,"anzahl","S_Mail","")
; Text der E-Mail, wird in der Funktion zusammen gesetzt
$Body= ""
For $i = 1 To $Anzahl
_Loeschen_alter_Backups()
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an wie oft das Programm durchlaufen wird",$i)
Next
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _Loeschen_alter_Backups()
[/autoit] [autoit][/autoit] [autoit];Backup Ordner
$ZielOrdner = IniRead($Ini,$i,"Pfad","")
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an ob der Zielodner richig ausgelesen wird",$ZielOrdner)
;Type der der Dateien
$Type = IniRead($Ini,$i,"Type","")
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an ob der Datei Type richtig ausgelesen wird",$Type)
;Maximales alter der Dateien
$LoeschDatum = IniRead($Ini,$i,"Alter","")
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an ob das Löschdatum richtig ausgelesen wird",$LoeschDatum)
;Name der zu überprüfenden Sicherung
$Name = IniRead($Ini,$i,"Name","")
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an ob der Name richtig ausgelesen wird",$Name)
;E-Mail Adresse für Fehlermeldung
$E_Mail = IniRead($Ini,$i,"E-Mail","technik@lis.eu")
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an ob die E-Mail Adresse richtig ausgelesen wird",$E_Mail)
;Wenn das Backup am Vortag läuft muss diese Variable in der Ini auf 1 gesetzt werden
$Zeitraum_des_Backups = IniRead($Ini,$i,"Zeitraum_des_Backups",0)
If $Zeitraum_des_Backups = "" Then $Zeitraum_des_Backups = 0
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an ob der Zeitraum der Backups richtig ausgelesen wird",$Zeitraum_des_Backups)
;Liest die Dateien in ein Array
$fileList = _FileListToArray($ZielOrdner, $Type, 1)
Dim $found[1]
;Das Array wird nach Namen Sortiert so das die Datei mit dem Neusten Zeitstempel an letzter Stellt steht
_ArraySort($fileList,0)
$test =_ArrayToString($fileList)
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an von welchem Datum die erste Datei im Ordner ist",$test)
;Die letzte Stelle des Arrays wird ermittelt
$letzte_position = UBound($fileList)-1
;Das Datum der ersten und letzten Datei im Zielordner wird ermittelt
$Datex = FileGetTime($ZielOrdner & "\" & $fileList[$letzte_position], 1, 0)
$fDatex = StringFormat("%s/%s/%s %s:%s:%s", $Datex[0], $Datex[1], $Datex[2], $Datex[3], $Datex[4], $Datex[5])
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an von welchem Datum die letzte Datei im Ordner ist",$fDatex)
$Date1 = FileGetTime($ZielOrdner & "\" & $fileList[1], 1, 0)
$fDate1 = StringFormat("%s/%s/%s %s:%s:%s", $Date1[0], $Date1[1], $Date1[2], $Date1[3], $Date1[4], $Date1[5])
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an von welchem Datum die erste Datei im Ordner ist",$fDate1)
;Es wird überprüft welche Datei aktueller ist
If $Fdatex > $fDate1 Then
$fDate_N = $Fdatex
Else
$fDate_N = $fDate1
If $DB = 1 Then MsgBox(1,"Dieses Fenster zeigt an von welchem Datum die neuste Datei ist",$fDate_N)
EndIf
;Es wird überprüft ob die aktuellste Datei zu dem Backupzeitraum passt
If _DateDiff('d', $fDate_N, _NowCalc()) > $Zeitraum_des_Backups Then ;Falls die Dateien älter sind als sie sein sollten werden alle Dateien die X Tage älter sind als die neuste gelöscht und es wird eine E-Mail Verschickt
For $X = 1 To $fileList[0]
;Ermitteln des Erstellungsdatums der Dateien
$Date = FileGetTime($ZielOrdner & "\" & $fileList[$X], 1, 0)
;Datum Formatieren um es mit der UDF "Date.au3" abgleichen zu können
$fDate = StringFormat("%s/%s/%s %s:%s:%s", $Date[0], $Date[1], $Date[2], $Date[3], $Date[4], $Date[5])
;Berechnung des Alters, Löschen von Dateien älter als X Tage
If _DateDiff('d', $fDate, $fDate_N) > $LoeschDatum Then
FileDelete($ZielOrdner & "\" & $fileList[$X])
_ArrayAdd($found, $ZielOrdner & $fileList[$X])
If $DB = 1 Then MsgBox(1, "Files deleted:", $fileList[$X], 1)
EndIf
$found[0] = UBound($found)
Next
$ToAddress = $E_Mail ; Zieladresse der E-Mail
$Subject = "Im Ordner " & $ZielOrdner &" ist keine aktuelle " & $Name & "!! Dringed Pruefen!!!"; subject from the email - can be anything you want it to be
$rc = _INetSmtpMail($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, @computername, -1)
If $DB = 1 Then MsgBox(1,"Mail verschickt wurde verschickt an",$E_Mail)
Return
Else
For $X = 1 To $fileList[0];Überprüfen der Dateien
;Ermitteln des Erstellungsdatums der Dateien
$Date = FileGetTime($ZielOrdner & "\" & $fileList[$X], 1, 0)
;Datum Formatieren um es mit der UDF "Date.au3" abgleichen zu können
$fDate = StringFormat("%s/%s/%s %s:%s:%s", $Date[0], $Date[1], $Date[2], $Date[3], $Date[4], $Date[5])
;Berechnung des Alters, Löschen von Dateien älter als X Tage
If _DateDiff('d', $fDate, _NowCalc()) > $LoeschDatum Then
FileDelete($ZielOrdner & "\" & $fileList[$X])
_ArrayAdd($found, $ZielOrdner & $fileList[$X])
If $DB = 1 Then MsgBox(1, "Files deleted:", $fileList[$X], 1)
EndIf
$found[0] = UBound($found)
Next
EndIf
;Schreiben einer aktuellen überschrift in eine Log Datei, Falls die Logdatei noch nicht existiert wird sie jetzt erstellt.
FileWriteLine($LogOrdner & $LogName,"######Diese " & $Type & " Dateien wurden am " & @MDAY & "." & @MON & "." & @YEAR & " um " & @HOUR & ":" & @MIN & " Uhr gelöscht!######")
;Falls keine Dateien gelöscht worden sind schreibt das Script dies in die Log Datei
If $found[0] = 1 Then FileWriteLine($LogOrdner & $LogName,"Es Sind Keine Dateien aus dem Ordner < " & $ZielOrdner & " gelöscht worden!")
;Alle von Script gelöschten Dateien werden in eine Log Datei geschrieben
For $Y = 1 To $found[0] -1
FileWriteLine($LogOrdner & $LogName,$found[$Y])
Next
EndFunc
[/autoit]Die Ini Datei sieht wie folgt aus:
Spoiler anzeigen
[anzahl]
anzahl=4
LogOrdner=D:\Sicherung\Skript\Log\
DB=0
SMTP_SVR=123.456.789.101
S_Mail=test@test.test
[1]
Pfad=D:\Sicherung\DBXXXX\
Type=*.PMP
Alter=2
Name=Oracle DBXXXX
E-Mail=test2@test.test
Zeitraum_des_Backups=1
[2]
Pfad=D:\Sicherung\DBYYYY\
Type=*.PMP
Alter=2
Name=Oracle DBYYYY
E-Mail=test2@test.test
Zeitraum_des_Backups=1
[3]
Pfad=D:\Sicherung\Skript\Log\
Type=*.txt
Alter=14
Name=Log Files
E-Mail=test2@test.test
Zeitraum_des_Backups=1
[4]
Pfad=D:\oracle\backup\dbXXXX\archivelogs\
Type=*.0001
Alter=7
Name=Archivlogs
E-Mail=test2@test.test
Zeitraum_des_Backups=1
seltsamerweise werden ich Archivlogs (Ini Datei Punkt 4) gelöscht und die
Logdatei wird auch erstellt.
Hat jemand eine Idee woran das liegen kann?
Das Betriebssystem des Servers ist Windows Server 2008 r2 Standard.
Die Benutzerkontensteuerung ist aus.
Vielen dank und grüße
Priest