pbelcl
Goto Top

Abfrage ob Datei von heute da ist

Hallo,

Ich sichere täglich meine Wordpress Dateien in einen Ordner als ZIP Datei.
Dieser Ordner hat folgenden Inhalt:

Um zu prüfen ob das Backup auch läuft erstelle ich mir von Zeit zu Zeit eine Textdatei von dem Ordnerinhalt und schicke es mir automatisch per Mail.

FRAGE:
Gibt es eine Möglichkeit auf der Dateiebene abzufragen ob Dateien der letzten 5 Tage da sind ?
Dann könnte ich den Listenversand nur dann auslösen wenn es einen Fehler gibt.

Hab irgendwie keine Idee wie ich da starten könnte ....

Content-Key: 321631

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

Printed on: December 4, 2022 at 05:12 o'clock

Member: wiesi200
wiesi200 Nov 21, 2016 at 07:33:05 (UTC)
Goto Top
Hallo,

ich würd es mal so sehen.
Das Vorhandensein der Datei bedeutet nicht zwangsläufig ein "sauberes" Backup.
Member: StefanKittel
StefanKittel Nov 21, 2016 at 08:13:23 (UTC)
Goto Top
Moin,

außer dem Datum müßtest Du aber auch die Größe und Integrität der Datei prüfen.
Und selbst dann könnte der DB-Dump innerhalb der Datei einfach eine Größe von 0 Bytes haben.

Besser wäre wenn das Skript seine Aktionen überprüfen würde und am Ende eine Mail verschickt.
MySQLDump, tar und zip haben auch unter Linux einen Rückgabewert.

Stefan
Member: pbelcl
pbelcl Nov 21, 2016 updated at 09:03:34 (UTC)
Goto Top
Danke für eure Gedanken dazu, aber die Prüfung der Datei passiert durch das Backup selbst.
Sollte es dort ein Problem geben, dann schickt das WPBackup von WordPress ein Email!
Das bedeutet WENN die Datei da ist dann ist sie auch OK!

Es soll nur eine zusätzliche Sicherheitsprüfung sein, denn es ist mir schon passiert, dass sich WPBackup selbst aufgehängt hat und dann kommen natürlich KEINE Mails mehr face-wink

Aber man könnte ja zusätzlich eine Prüfung im Batch Prozesse einbauen, ob die Datein größer "0".
Member: StefanKittel
StefanKittel Nov 21, 2016 at 09:20:52 (UTC)
Goto Top
Hallo,

Sonderfall:
WPBackup konnte die Mail nicht senden oder sie ging verloren.
Eine nicht vorhandene Fehlermail ist noch keine Erfolgreich-Meldung.

Kann WPBackup nicht Mails im Erfolgfall senden?
Du kannst diese ja direkt sortieren.

Stefan
Member: Lochkartenstanzer
Lochkartenstanzer Nov 21, 2016 updated at 09:29:49 (UTC)
Goto Top
Jupp,

Das ist auch meine methode. Es wird immer ein mail bei backups verschickt. Wenn die mail ausbleibt, ist etwas schiefgelaufen.

lks
Member: Kraemer
Kraemer Nov 21, 2016 at 09:41:17 (UTC)
Goto Top
Zitat von @Lochkartenstanzer:

Jupp,

Das ist auch meine methode. Es wird immer ein mail bei backups verschickt. Wenn die mail ausbleibt, ist etwas schiefgelaufen.

lks
Ganz meine Meinung!
Member: SaschaRD
SaschaRD Nov 21, 2016 at 10:51:34 (UTC)
Goto Top
Hallo @pbelcl,

für ein Windows System könntest Du es mit Powershell bewerkstelligen. Da als Dateiendung .tar angegeben ist könnte es in shell umgearbeitet werden.
Könnte noch verfeinert werden in dem nicht geprüft wird ob 5 Dateien mit der Namenbezeichnung Wildcard_Tagessicherung.tar vorhanden sind, sondern wann das Erstellungsdatum der Dateien ist etc.

Hier gibt es wie üblich viele Wege zum Ziel.

Gruß, Sascha
Mitglied: 131381
131381 Nov 21, 2016 updated at 11:28:10 (UTC)
Goto Top
Abfrage ob Datei von heute da ist
für heute:
Gibt es eine Möglichkeit auf der Dateiebene abzufragen ob Dateien der letzten 5 Tage da sind ?
für alle 5 Tage:
Gruß
Member: pbelcl
pbelcl Nov 22, 2016 at 12:28:52 (UTC)
Goto Top
Danke für eure Tipps!!
Sorry, ich haben nicht gesagt, dass ich die Lösung für ein Windows System bevorzugt mit Batch machen möchte!
Mit Linux und Power Shell kenn ich mich leider gar nicht aus!
Werd mir trotzdem mal die Codes ansehen, danke!

Zu den Tipps mit den Emails:
Ich weiß dass WPBackup ein Mail schicken kann wenn das Backup gelaufen ist.
Da ich einige Wordpress Blogs administrieren muss würde ich gerne nur dann ein Mail bekommen, wenn die Sicherung nicht geklappt hat.
Sonst kann ich bei meiner alten Lösung auch bleiben face-wink
Member: SaschaRD
SaschaRD Nov 22, 2016 at 13:59:06 (UTC)
Goto Top
Hallo @pbelcl,

als Empfehlung mach es nicht mit Batch, sondern direkt mit Powershell. Die Einarbeitungszeit lohnt sich alle male.
Hinweis dazu: Powershell liefert ein Send-MailMessage Methode mit, welche bei Batch über ein externes Tool gemacht werden müsste (Blat oder ein Powershell aufruf).

Zu dem von mir genannten Beispiel, erstell eine Powershell-Skript Datei (namexyz.ps1). Wurde die Powershell noch nie ausgeführt müsstest Du die Policy-Einstellungen anpassen, damit Skript Dateien ausgeführt werden dürfen. Hier eine Beitrag Set-ExecutionPolicy, kopiere den Code hinein und leg los.

Wie in Batch auch dir C:\BackupOrdner listet den Inhalt auf, zusätzlich ist eine Filterung auf Objekte mit dem Namen Wildcard_Tagessicherung.tar angsetzt und zählt letztlich die Ergebnisse zusammen und vergleicht Sie "lt = lower than"; ist also das Ergebnis kleiner 5 ist die Bedingung nicht erfüllt und es wird dir eine E-Mail zugeschickt.

So einfacher ist es, bei Fragen einfach antworten. Hier gibt es eine Vielzahl von kompetenten Usern =)

Bis denne und Gruß, Sascha
Member: colinardo
colinardo Nov 22, 2016 updated at 15:49:32 (UTC)
Goto Top
Servus zusammen.
Hier gibt es wie üblich viele Wege zum Ziel.
Joa die gibt es massenhaft.
Z.B. kann man beide Welten Batch + PS kombiniert als Quasi-Einzeiler nutzen, wenn man noch nicht so weit ist die PS zu handhaben oder nicht von der CMD lassen kann face-wink.
Odner, Mail-Eigenschaften wie Mail-Adressen, Username, Passwort und Server natürlich anpassen.

Würde ich aber auch alles als "Würgarounds" bezeichnen, denn sowas gehört einfach ins Ursprungsscript das man so schreiben sollte das sich dort nichts "aufhängt". Lässt sich mit Powershell und einem separaten Prozess eine einfache Überwachung realisieren welche einen maximalen Timeout wartet falls sich ein Programm weg hängen sollte.

Grüße Uwe
Member: pbelcl
pbelcl Nov 24, 2016 at 07:40:56 (UTC)
Goto Top
@uwe
Danke für dein Skript.
Ich habe jetzt alle Parameter eingesetzt, leider erzeugt das Skript einen Fehler!
Das mit dem Powershell Skript ist schwer für mich, da ich keinerlei Kentnisse darüber habe wie es funktioniert!

Ich würde gerne soviel davon in batch machen, denn ich habe beispielsweise den Mailversand bereits mehrmals gelöst und das läuft in einem Einzeiler im Batch. Es ist also nicht nötig DAFÜR das Rad neu zu erfinden.

Mir geht es eigentlich nur darum heruaszufinden sind die angesprochenen Files da oder nicht....
Wenn das mit Batch Bordmitteln nicht klappt, dann ist das schade, aber ich möchte auch nicht jetzt dafür powershell lernen face-wink
Mitglied: 131381
131381 Nov 24, 2016 updated at 07:58:39 (UTC)
Goto Top
Klappt hier problemlos, vermutlich nutzt du keine PS3.0.
aber ich möchte auch nicht jetzt dafür powershell lernen
Wird aber langsam Zeit
https://www.administrator.de/link/insider-build-powershell-windows-cmd-e ...
Und lernt sich schneller als man denkt!!
Viel leichter als die Batch-Ungereimtheiten und Bugs und much much more power.
Member: pbelcl
pbelcl Nov 24, 2016 at 12:52:06 (UTC)
Goto Top
Das bringt mich nun dazu mich schön langsam doch mit der Powershell auseinanderzusetzen ...

Der Codeschnipsel von colinardo öffnet ein Comand Fenster und zeigt aber nichts an.
Nachdem ich das Echo eingeblendet habe sieht man dass der Code immer wieder durchläuft.

Ich hab darafhin einige Dateien aus den zu prüfenden Ordner entfernt und es hat sich nichts geändert.
Kann leider nicht rausfinden warum ;-(

Ist es vielleicht möglich das Email senden vorerst zu lassen und den Powershell Teil nur auf die Dateiprüfung zu beschränken?
Eventuell das Ergebnis in eine Varaible schreiben oder als Errorlevel zurückzugeben die ich im Batch weiterverwenden kann?

Dann könnte ich prüfen woran es liegt.....
Mitglied: 131381
131381 Nov 24, 2016 updated at 15:37:44 (UTC)
Goto Top
Du hast 100% eine veraltete PS (2.0) oder die Executionpolicy ist nicht gesetzt... Also lerne erst mal mit der PS umzugehen dann sehen wir weiter, denn das Script geht face-smile.
Member: pbelcl
pbelcl Dec 16, 2016 at 15:34:03 (UTC)
Goto Top
Ich komm mit dem Powershell Zeugs leider nicht zurecht.
hab jetzt einige Zeit versucht mich da einzulesen, aber für das was ich jetzt mal brauche eine für mich komplett neue Sprache zu lernen ist mir etwas zu viel.
Das fühlt sich an wie mit Kanonen auf Spatzen zu schiessen ;-(

Ich fürchte, wenn es keine Batch Lösung gibt, dann lass ich es so wie es ist.
Danke jedenfalls für eure Hilfe...
Mitglied: 131381
131381 Dec 16, 2016 updated at 16:48:42 (UTC)
Goto Top
Das kann man schon mit plain Batch machen dazu brauchst du dann aber zum Berechnen der Datumswerte diese Funktionen hier
http://www.robvanderwoude.com/sourcecode.php?src=dateadd_nt
Und das ist dann eher mit "Kanonen auf Spatzen" geschossen als den Einzeiler von oben zu nutzen face-smile

Wllkommen in der Gegenwart unter Windows und die PS ist dort jetzt schon lange Standard.
Diverse Rollen lassen sich nur noch mit Ihr vernünftig steuern.
Member: colinardo
Solution colinardo Dec 17, 2016 updated at 11:20:26 (UTC)
Goto Top
Zitat von @pbelcl:
Ich fürchte, wenn es keine Batch Lösung gibt, dann lass ich es so wie es ist.
Die gibt es mit einigem Aufwand lässt sich alles machen, ob man diesen Ratten### tatsächlich will, ist eine andere Frage ... face-wink

Hier dein vorgezogenes Weihnachtsgeschenk vom Wichtel der in seiner Batchkruschtelkiste auf dem Speicher gekramt hat. face-smile

Grüße und schöne Weihnachten
Uwe
Member: pbelcl
pbelcl Dec 18, 2016 at 08:07:29 (UTC)
Goto Top
Danke Colinardo für dieses TOLLE Gesachenk!!!!
Ich habe es schon eingebaut, funktioniert toll!
Member: pbelcl
pbelcl Dec 18, 2016 at 08:17:52 (UTC)
Goto Top
Hallo mikrotik,
Du hast vollkommen Recht, mein Vergleich hinkt etwas face-wink

Zitat von @131381:
Wllkommen in der Gegenwart unter Windows und die PS ist dort jetzt schon lange Standard.
Diverse Rollen lassen sich nur noch mit Ihr vernünftig steuern.

Es ist nur sehr schwer nach 25 Jahren Batch Erfahrung diesen Zustand zur Kenntnis zu nehmen ;-(
Aber ich möchte wirklich damit beginnen, aber LANGSAM face-wink

Zitat von @131381:
Du hast 100% eine veraltete PS (2.0) oder die Executionpolicy ist nicht gesetzt.>
Ich habe meine Powershell noch nie benutzt, daher wirst du bei beiden Annahmen recht haben!
Kannst du mir einen Tipp geben wie ich das prüfen kann?

Ich habe mit dem Weihnachtsgeschenk von colinardo nun mal mein Batch lauffähig und nun würde ich gerne das Ding in der Powershell machen und auch verstehen!
Hast du Lust mir dabei zu helfen?
Member: colinardo
Solution colinardo Dec 18, 2016 updated at 10:24:31 (UTC)
Goto Top
Freut mich das es dich freut face-smile

Also, der obige Powershell-Batch-Schnippsel war ja für die direkte Verwendung von Powershell-Code innerhalb einer Batchdatei gedacht. Da man bei dieser Variante etwas mit Sonderzeichen aufpassen muss wie z.B. Prozentzeichen und Anführungszeichen, hier mal der reine PS Code für die Ausführung in einer Powershell-Konsole.
back-to-topFolgend die Erläuterungen zum Code:
Um das ganze Konstrukt erstreckt sich eine IF-Anweisung
Die Bedingung ist hier der Hauptteil welcher sich aus folgenden Teilen zusammensetzt:
Das folgende Konstrukt erzeugt ein Array aus Zahlen, genauer 0,1,2,3,4
Ausschreiben könnte man es auch so (typische For-Schleife mit Ausgabe der Laufvariablen)
dieses Array wird dann via Pipe | an eine Foreach-Schleife übergeben welche mit diesem Kürzel abgekürzt wird %{}.
In der Schleife wird für jede Nummer des Arrays also 0-4 jeweils der Dateiname der Backupdateien generiert. Und zwar wird dazu vom heutigen Datum die Nummer aus dem Array abgezogen also beim ersten Durchlauf 0 beim zweiten 1 usw. Das Datum wird dann zu einem String in deinem Format umgeformt und daran das _Tagessicherung.tar als String angehängt.
Das Zwischenergebnis dieser Schleife ist dann ein Array aus den Dateinamen der letzten 5 Backupsätze, Quasi die Referenz wie sie sein soll.
Als nächsten Schritt übergeben wir dieses Array aus Dateinamen via Pipe an ein sogenanntes Where-Object für das die Abkürzung ?{} ist, Powershell Programmierer mögens gerne kurz face-smile. Das Where-Object ist so etwas wie eine IF-Prüfung für die Objekte in der Pipeline. Es prüft die Bedingung die in ihm steht und wenn sie $True ist wird das aktuelle Objekt in der Pipeline (hier der Dateiname des Backups) in der Pipeline weitergereicht, ansonsten nicht.
Hier wird jetzt für jeden Dateinamen der im Array via Pipe übergeben wurde geprüft ob die Datei im Backup-Verzeichnis vorhanden ist, Test-Path erwartet als Parameter einen Pfad, welchen wir übergeben, jedoch mit der Besonderheit das wir diesen mit dem jeweiligen Dateinamen aus dem Array ergänzen, was wir mit der speziellen Variablen $_ machen welche immer das aktuelle Objekt der Pipeline also hier den Dateinamen enthält. Doch halt, jetzt fragst du dich was das Ausrufezeichen vor dem Test-Path Ausdruck macht: Ganz simpel Test-Path liefert uns einen Boolean-Wert zurück ob eine Datei existiert. Tut sie das $true, ansonsten $False. Das Ausrufezeichen bedeutet -NOT also das umdrehen des boolschen Wertes wie du es sicher aus Batch mit if not exist kennst.
So, nun haben wir also als Ergebnis der IF-Bedingung die Dateinamen die nicht im Backupverzeichnis vorkommen. Wenn also die Bedingung alle Dateien findet hat das Ergebnis der Bedingung keine Ausgabe, also ist sie $false und die Aktion in der IF-Schleife wird nicht ausgeführt. Bei mindestens einer fehlenden Datei gibt es ein Ergebnis und die Bedingung wird $true und die Mail wird verschickt.
Die Parameter des Send-MailMessage-Befehls sollten klar sein. Wenn nicht kannst du sie hier nachschlagen
http://ss64.com/ps/send-mailmessage.html

Zum Testen des Codes öffnest du eine Powershell ISE und kopierst ihn dort hinein, passt den Backup-Pfad in der Bedingung, sowie die Parameter von Send-Mailmessage an und drückst F5. Fertig.

Wie man das ganze dann als Skript speichert und ausführt siehe:


back-to-topAnleitung: Wie starte ich Powershell-Scripte
  • Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
back-to-topStarten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
back-to-topStarten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!
Der einfachste Aufruf sieht hier so aus:
Wenn man dem Script Parameter übergeben möchte:
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
Man kann auch mehrere Scripte hintereinander ausführen lassen:
Weitere Parameter zeigt einem ein powershell -? in einer Konsole an.
back-to-topStarten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"

Hoffe das hilft dir beim PS Einstieg etwas face-smile

Schönen 4ten Advent

Grüße Uwe
Member: pbelcl
pbelcl Dec 20, 2016 updated at 07:19:50 (UTC)
Goto Top
Vielen kieben Dank Uwe!!
Ich werde deine tolle Erklärung in der nächste Zeit mal genau durcharbeiten und testen.
Dann mal schaun wie schnell ich einen Einstieg in die Powershell finde!

Ich weiß eh, dass ich da hin muss, aber meine fast 200 Batch Skripte laufen nur gerade so toll...
Und die wichtigste Regel der EDV lautet ja: Never touch a running system face-wink
Mitglied: 131381
131381 Dec 20, 2016 updated at 07:54:29 (UTC)
Goto Top
Und die wichtigste Regel der EDV lautet ja: Never touch a running system
But always be prepared for the future face-wink

Ich hatte die PS damals an einem Wochenende drin, zumindest die wichtigsten Grundlagen, und das alles nur durch Lesen der Referenzmaterialien von Microsoft. ist zwar etwas trocken, doch lernst du damit komprimiert ziemlich viel und verpasst nichts.
Der Rest kommt von alleine durch einfaches stellen von Aufgaben.
Was viel hilft ist wenn du die häufig genutzten Klassen des .NET-Framework kennst denn darauf baut PS auf. Die CMDLets mit Ihren Parametern sind ja Pillepalle und lassen sich meist durch die Intellisense schon erahnen.