Ordner mit .bat überwachen
Hallo,
vielleicht kann mir hier jemand weiterhelfen.
Ich möchte einen Ordner mit einer Batch Datei überwache diese soll jede Stunde über die Windows Aufgabenplanung mit Administrativen Rechten gestartet werden.
Die Batch Datei soll einen Ordner überwachen in dem PDF Dateien landen.
Die Dateien werden eigentlich automatisch verschoben jedoch bleiben ab und zu ein paar Dateien hängen.
Aus diesem Grund soll die Batch das Änderungsdatum von allen Dateien die sich zu dieser Zeit im Ordner befinden überprüfen und mit der aktuellen Zeit vergleichen.
Sollte bei einer Datei das Änderungsdatum älter als eine Stunde sein, so weiß die Batch das die Datei nicht automatisch weiter verschoben wurde.
In diesem Fall soll eine Email verschickt werden die diese Information enthält.
Das ganze Funktioniert bei mir schon ganz Gut ich bekomme es nur irgendwie nicht hin die Uhrzeit des Änderungsdatums auszulesen.
Kann mir jemand dazu einen Tipp geben?
Liebe Grüße und vielen Dank im voraus!
vielleicht kann mir hier jemand weiterhelfen.
Ich möchte einen Ordner mit einer Batch Datei überwache diese soll jede Stunde über die Windows Aufgabenplanung mit Administrativen Rechten gestartet werden.
Die Batch Datei soll einen Ordner überwachen in dem PDF Dateien landen.
Die Dateien werden eigentlich automatisch verschoben jedoch bleiben ab und zu ein paar Dateien hängen.
Aus diesem Grund soll die Batch das Änderungsdatum von allen Dateien die sich zu dieser Zeit im Ordner befinden überprüfen und mit der aktuellen Zeit vergleichen.
Sollte bei einer Datei das Änderungsdatum älter als eine Stunde sein, so weiß die Batch das die Datei nicht automatisch weiter verschoben wurde.
In diesem Fall soll eine Email verschickt werden die diese Information enthält.
Das ganze Funktioniert bei mir schon ganz Gut ich bekomme es nur irgendwie nicht hin die Uhrzeit des Änderungsdatums auszulesen.
Kann mir jemand dazu einen Tipp geben?
Liebe Grüße und vielen Dank im voraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 604571
Url: https://administrator.de/contentid/604571
Ausgedruckt am: 23.11.2024 um 12:11 Uhr
14 Kommentare
Neuester Kommentar
Moin,
Mit Powershell ein leichtes, jedoch wäre es hier sinnvoller, die gewünschten Aktionen direkt auszuführen, wenn etwas beim verschieben falsch läuft. In jedem Fall besser, als den Ordner zu überwachen.
Mein Vorschlag hier wäre, du postest uns mal dein Batch-Skript, welches die PDF-Dateien verschiebt; und wir schreiben dir das als Powershell-Skript um, damit weiterer Ärger ausbleibt.
Gruß Thomas
Zitat von @GreeeNn:
Die Dateien werden eigentlich automatisch verschoben jedoch bleiben ab und zu ein paar Dateien hängen.
Ich würde in dem Fall eher mal prüfen, wieso diese Dateien hängen bleiben.Die Dateien werden eigentlich automatisch verschoben jedoch bleiben ab und zu ein paar Dateien hängen.
Ich möchte einen Ordner mit einer Batch Datei überwache diese soll jede Stunde über die Windows Aufgabenplanung mit Administrativen Rechten gestartet werden.
Die Batch Datei soll einen Ordner überwachen in dem PDF Dateien landen.
Wieso mit Administrativen Rechten?! Sieht mir nicht danach aus, das diese erforderlich wären.Die Batch Datei soll einen Ordner überwachen in dem PDF Dateien landen.
Aus diesem Grund soll die Batch das Änderungsdatum von allen Dateien die sich zu dieser Zeit im Ordner befinden überprüfen und mit der aktuellen Zeit vergleichen.
Mit Batch kaum zu Realisieren, oder man muss schon extrem masochistisch veranlagt sein.Mit Powershell ein leichtes, jedoch wäre es hier sinnvoller, die gewünschten Aktionen direkt auszuführen, wenn etwas beim verschieben falsch läuft. In jedem Fall besser, als den Ordner zu überwachen.
Mein Vorschlag hier wäre, du postest uns mal dein Batch-Skript, welches die PDF-Dateien verschiebt; und wir schreiben dir das als Powershell-Skript um, damit weiterer Ärger ausbleibt.
Gruß Thomas
Das ist ein Skript zum überwachen des Ordners. Wie bereits erwähnt, bitte das Skript posten, welches die PDF-Dateien verschiebt.
Das Ziel sollte hier sollte sein: Das Skript veruscht die Dateien zu verschieben, falls dies (warum auch immer) fehlschlägt, wird eine E-Mail mit Details zu dem Fehler rausgeschickt. Damit ist ein zweites Skript welches den Ordner überwacht überflüssig.
Das Ziel sollte hier sollte sein: Das Skript veruscht die Dateien zu verschieben, falls dies (warum auch immer) fehlschlägt, wird eine E-Mail mit Details zu dem Fehler rausgeschickt. Damit ist ein zweites Skript welches den Ordner überwacht überflüssig.
Hallo,
Die Batch stimmt schon fast. Da ist nur ein kleiner Fehler drin der die Ausführung verhindert.
Batch kentn das Format "Datum" nicht, nur Zahlen.
Deshalb musst du einfach dein Datum von %%~ti und von heute im Format YYYMMDD ist, also nur anders zusammengesetzt. Dann klappt das "if !Heute! NEQ !Datum!" auch.
Der Aufwand hällt sich also doch in Grenzen...
Gruß
...
Die Batch stimmt schon fast. Da ist nur ein kleiner Fehler drin der die Ausführung verhindert.
Batch kentn das Format "Datum" nicht, nur Zahlen.
Deshalb musst du einfach dein Datum von %%~ti und von heute im Format YYYMMDD ist, also nur anders zusammengesetzt. Dann klappt das "if !Heute! NEQ !Datum!" auch.
Der Aufwand hällt sich also doch in Grenzen...
Gruß
...
Moin,
Wenn Du so lieb fragst.
Ist jetzt nicht mehr eine Zeile, aber so würde ich das als Skript schreiben. Ist übersichtlicher und schneller als der Einzeiler.
Und jetzt noch ein paar Worte zum Einzeiler:
1. Eine der wichtigsten Techniken der Powershell vor allem auf der Konsole ist die Pipe (|). Dabei wird die Ausgabe eines Befehls als Stream dem nächsten Befehl übergeben. Sehr praktisch.
2. % ist eine Abkürzung (ein Alias genau gesagt) für foreach-object.
3. $_ ist die Variable, in der das Objekt steht aus der Pipe, das gerade dran ist.
hth
Erik
Zitat von @GreeeNn:
danke für deinen Lösungsansatz @erikro!
danke für deinen Lösungsansatz @erikro!
>> Get-ChildItem *.pdf | %{if($_.LastWriteTime -lt (get-date).addhours(-1)){ Send-MailMessage ...}}
>>
Wenn Du so lieb fragst.
PARAM(
$typ="pdf",
$path, # Pfad des zu überwachenden Ordners eintragen
$time= (get-date).addhours(-1), # Holt das aktuelle Datum mit Zeit und zieht eine Stunde ab
# Variabeln für den Emailversand
$SMTP=XXX,
$SUBJECT=XXX,
$BODY,
$FROM="XXX",
$TO="XXX"
# Im PARAM-Block stehen alle Parameter eines Skripts, die dann wie in der
# PS üblich mit -variablenname dem Skript übergeben werden. Also z. B.
# dein_skript-ps1 -typ doc -path $env:userprofile\Documents.
# Wird im PARAM-Block einem Parameter ein Wert zugewiesen, dann ist das der default.
# Die Parameter werden mit Kommata getrennt. Nach dem letzten darf (leider) kein Komma stehen.
)
$files = get-childitem $path\*.pdf # Liest alle Dateiobjekte, die PDFs sind,
# in das array $files ein.
# -recurse, falls Unterverzeichnisse
# mit durchsucht werden sollen.
foreach($file in $files) { # Für jedes Element des Arrays $files, das wir in der Schleife $file nennen
if($file.LastWriteTime -lt $time) { # Wenn die Eigenschaft des LastWriteTime des Objekts kleiner ist als $time
# Schicke die Mail
send-mailmessage ...
}
}
Ist jetzt nicht mehr eine Zeile, aber so würde ich das als Skript schreiben. Ist übersichtlicher und schneller als der Einzeiler.
Und jetzt noch ein paar Worte zum Einzeiler:
1. Eine der wichtigsten Techniken der Powershell vor allem auf der Konsole ist die Pipe (|). Dabei wird die Ausgabe eines Befehls als Stream dem nächsten Befehl übergeben. Sehr praktisch.
2. % ist eine Abkürzung (ein Alias genau gesagt) für foreach-object.
3. $_ ist die Variable, in der das Objekt steht aus der Pipe, das gerade dran ist.
hth
Erik
Moin,
Dann rücke doch mal das Skript raus. Meine Glaskugel sagt mir nämlich folgendes:
Das Skript sieht so aus:
Und dann haben wir eine race condition. Dauert das, was da gemacht wird, zu lange, wird schon der Verschiebebefehl ausgeführt, der aber gegen die Wand läuft, weil noch ein lock auf der Datei ist. Besser wäre so ein Konstrukt:
Liebe Grüße
Erik
Zitat von @GreeeNn:
Natürlich wäre es der Optimalfall das Skript das die Daten verschieb zu verbessern.
Jedoch habe ich die Anweisung bekommen diese Überwachung einzurichten, da der fall das die Daten nicht verschoben werden relativ selten eintritt.
Natürlich wäre es der Optimalfall das Skript das die Daten verschieb zu verbessern.
Jedoch habe ich die Anweisung bekommen diese Überwachung einzurichten, da der fall das die Daten nicht verschoben werden relativ selten eintritt.
Dann rücke doch mal das Skript raus. Meine Glaskugel sagt mir nämlich folgendes:
Das Skript sieht so aus:
# Mache irgendwas mit dem PDF. Drucken vielleicht.
# Warte ein paar Sekunden
# Verschiebe das PDF
Und dann haben wir eine race condition. Dauert das, was da gemacht wird, zu lange, wird schon der Verschiebebefehl ausgeführt, der aber gegen die Wand läuft, weil noch ein lock auf der Datei ist. Besser wäre so ein Konstrukt:
# Mache was mit dem PDF
while(#prüfung, ob das PDF gelockt ist) {
#Warte
}
# Verschiebe das PDF
Liebe Grüße
Erik
Hallo,
Wenn du die Zeit vergleichen willst dann nimm für heute halt %time% statt %date% oder noch besser beides und in der for Schleife in Zeile 21 holst du dir dann beides raus.
Das Prinzip ist das selbe nur halt im Format YYMMTThhmmss. Das aufaddieren von 1 Stunde mit Berücksichtigung des Datums geht in Batch (wurde hier auch schon mal beschrieben), ist aber mit einem gewissen Aufwand verbunden. Da wäre dann eine andere Skriptsprache, zumindest teilweise, doch besser geeignet.
Gruß
...
Wenn du die Zeit vergleichen willst dann nimm für heute halt %time% statt %date% oder noch besser beides und in der for Schleife in Zeile 21 holst du dir dann beides raus.
Das Prinzip ist das selbe nur halt im Format YYMMTThhmmss. Das aufaddieren von 1 Stunde mit Berücksichtigung des Datums geht in Batch (wurde hier auch schon mal beschrieben), ist aber mit einem gewissen Aufwand verbunden. Da wäre dann eine andere Skriptsprache, zumindest teilweise, doch besser geeignet.
Gruß
...
Gerne.
Ich bin gerade dabei dein Powershell Skript auf meine Anforderungen anzupassen dabei ist mir ein kleiner Fehler aufgefallen den ich gerne verbesser würde.
$typ="pdf",
$path, # Pfad des zu überwachenden Ordners eintragen
$time= (get-date).addhour(-1), # Holt das aktuelle Datum mit Zeit und zieht eine Stunde ab
$path, # Pfad des zu überwachenden Ordners eintragen
$time= (get-date).addhour(-1), # Holt das aktuelle Datum mit Zeit und zieht eine Stunde ab
.addhour muss durch .addhours ersetzt werden da anstonsten ein Fehler kommt.
Oooops. Ja, es muss der Plural sein. Ich habe es oben korrigiert. Danke für den Hinweis.