Automatisierte Diashow
Hoffe ihr könnt mir wieterhelfen
Moin Moin,
Ich möchte gerne eine automatisierte Diashow auf einem kleinen Rechner einrichten, die dann beispielsweise in einem Warteraum auf einem Fernseher läuft.
Ich stelle mir das wie folgt vor:
Ich machen ein Foto via Handy und schicke es dann per Mail mit Betreff: "3 Tage" (warum erläutere ich weiter unten) an eine E-Mail Adresse die auf dem Rechner eingerichtet ist (Thunderbird).
Jetzt habe ich mir ein Plugin besorgt, welches Automatisch die Datei in einen Ordner ablegt und die Datei in "3 Tage" umbenennt.
Ich möchte jetzt eine Batch-Datei haben die Irfanview startet.
Irgendwie sowas:
@echo off
set tragetfolder=C:\Bilder\NEW
set irfanview="C:\Program Files (x86)\IrfanView\i_view32.exe"
echo Starte Irfanview Diaschow
%irfanview% /slideshow=%tragetfolder%
pause
So und jetzt kommt der Tricky-Part. Ich habe die Datei ja "3 Tage" genannt. Kann ich an hand des Names eine Batch-Datei in den Autostart legen, sodass die sie nach 3 Tagen in einen anderen Ordner verschoben wird?
Oder habt ihr vielleicht eine bessere Idee?
Vielen Dank schon einmal im Voraus.
Gruß
Bründl
Moin Moin,
Ich möchte gerne eine automatisierte Diashow auf einem kleinen Rechner einrichten, die dann beispielsweise in einem Warteraum auf einem Fernseher läuft.
Ich stelle mir das wie folgt vor:
Ich machen ein Foto via Handy und schicke es dann per Mail mit Betreff: "3 Tage" (warum erläutere ich weiter unten) an eine E-Mail Adresse die auf dem Rechner eingerichtet ist (Thunderbird).
Jetzt habe ich mir ein Plugin besorgt, welches Automatisch die Datei in einen Ordner ablegt und die Datei in "3 Tage" umbenennt.
Ich möchte jetzt eine Batch-Datei haben die Irfanview startet.
Irgendwie sowas:
@echo off
set tragetfolder=C:\Bilder\NEW
set irfanview="C:\Program Files (x86)\IrfanView\i_view32.exe"
echo Starte Irfanview Diaschow
%irfanview% /slideshow=%tragetfolder%
pause
So und jetzt kommt der Tricky-Part. Ich habe die Datei ja "3 Tage" genannt. Kann ich an hand des Names eine Batch-Datei in den Autostart legen, sodass die sie nach 3 Tagen in einen anderen Ordner verschoben wird?
Oder habt ihr vielleicht eine bessere Idee?
Vielen Dank schon einmal im Voraus.
Gruß
Bründl
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 170641
Url: https://administrator.de/contentid/170641
Ausgedruckt am: 26.11.2024 um 16:11 Uhr
15 Kommentare
Neuester Kommentar
Hallo Bründl,
soll das verschieben der Dateien denn einmalig beim hochfahren des Rechners passieren, oder soll das quasi ein Monitorscript sein, was ständig im Hintergrund läuft und immer wenn z.B. 3 Tage seít der Erstellung der "3 Tage.jpg" vergangen sind, diese verschieben? Gibt es außerdem noch mehr Zeitintervalle als nur "Tage", z.B. "Wochen" oder "Stunden"? Was macht das PlugIn, wenn schon eine Datei "3 Tage.jpg" im Zielordner existiert und Du schickst nochmals eine EMail mit dem Betreff "3 Tage"?
Gruß
Friemler
soll das verschieben der Dateien denn einmalig beim hochfahren des Rechners passieren, oder soll das quasi ein Monitorscript sein, was ständig im Hintergrund läuft und immer wenn z.B. 3 Tage seít der Erstellung der "3 Tage.jpg" vergangen sind, diese verschieben? Gibt es außerdem noch mehr Zeitintervalle als nur "Tage", z.B. "Wochen" oder "Stunden"? Was macht das PlugIn, wenn schon eine Datei "3 Tage.jpg" im Zielordner existiert und Du schickst nochmals eine EMail mit dem Betreff "3 Tage"?
Gruß
Friemler
Hallo Bründl,
also ein Monitorscript. Dann wird es etwas komplizierter. Du kannst dazu natürlich auch eine normale Batchdatei nehmen, aber das erzeugt eine sehr hohe Prozessorlast (~60%, je nach Rechner). Deshalb würde ich einen WMI Permanent Event Consumer bevorzugen, der das Verzeichnis, in dem die Dateien vom Thunderbird-PlugIn abgelegt werden, auf neu erstellte Dateien überwacht und jedesmal ein VBScript (als Event Handler) ausführt, wenn das passiert. Ich habe da schon eine fertige Lösung und erst kürzlich in diesem Thread etwas darüber geschrieben. Das dort verwendete Event Handler Script (inkl. PDF-Konvertierung) ist für Dich natürlich unbrauchbar und müsste neu geschrieben werden. Mir ist es nun aber schon öfter passiert, dass ich jemandem diese Lösung vorgeschlagen und Arbeit in die Sache investiert habe und dann nie wieder etwas von demjenigen gehört habe. Schau Dir den eben erwähnten Thread deshalb erstmal an und teile mir mit, ob Du an dieser Lösung interessiert wärst, dann können wir über das Event Handler Script reden.
[EDIT]
Welche OS-Version wird verwendet?
[/EDIT]
Gruß
Friemler
also ein Monitorscript. Dann wird es etwas komplizierter. Du kannst dazu natürlich auch eine normale Batchdatei nehmen, aber das erzeugt eine sehr hohe Prozessorlast (~60%, je nach Rechner). Deshalb würde ich einen WMI Permanent Event Consumer bevorzugen, der das Verzeichnis, in dem die Dateien vom Thunderbird-PlugIn abgelegt werden, auf neu erstellte Dateien überwacht und jedesmal ein VBScript (als Event Handler) ausführt, wenn das passiert. Ich habe da schon eine fertige Lösung und erst kürzlich in diesem Thread etwas darüber geschrieben. Das dort verwendete Event Handler Script (inkl. PDF-Konvertierung) ist für Dich natürlich unbrauchbar und müsste neu geschrieben werden. Mir ist es nun aber schon öfter passiert, dass ich jemandem diese Lösung vorgeschlagen und Arbeit in die Sache investiert habe und dann nie wieder etwas von demjenigen gehört habe. Schau Dir den eben erwähnten Thread deshalb erstmal an und teile mir mit, ob Du an dieser Lösung interessiert wärst, dann können wir über das Event Handler Script reden.
[EDIT]
Welche OS-Version wird verwendet?
[/EDIT]
Gruß
Friemler
Hallo Bründl,
na ja, eigentlich ist das dann nicht sooo wichtig. Aber evtl. fällt dem Chef der Firma in Zunkunft noch etwas anderes ein, was auf dem Rechner laufen soll. Da der ja sowieso schon recht schwach auf der Brust ist, könnte das dann schwierig werden. Vom Aufwand her ist ein Batch-Monitor mit einem VBScript als Event Handler auch vergleichbar und wenn Du Dich nur ein wenig mit Batch auskennst, müsste ich da sowieso ran .
Ich würde im VBScript Event Handler mit
Gruß
Friemler
na ja, eigentlich ist das dann nicht sooo wichtig. Aber evtl. fällt dem Chef der Firma in Zunkunft noch etwas anderes ein, was auf dem Rechner laufen soll. Da der ja sowieso schon recht schwach auf der Brust ist, könnte das dann schwierig werden. Vom Aufwand her ist ein Batch-Monitor mit einem VBScript als Event Handler auch vergleichbar und wenn Du Dich nur ein wenig mit Batch auskennst, müsste ich da sowieso ran .
Ich würde im VBScript Event Handler mit
SCHTASKS
einen geplanten Task erstellen, der die Bilddatei nach der Zeitspanne löscht, die im Namen angegeben ist. Ich würde mich, wenn ich nichts gegenteiliges mehr von Dir höre, mal da ran setzen.Gruß
Friemler
Hallo Bründl,
mir war heute etwas langweilig, deshalb habe ich das Event Handler Script trotzdem geschrieben .
Voraussetzungen
Erstmal der Installer. Ich habe den Pfad des zu überwachenden Verzeichnisses in Zeile 14 auf
Wegen Zeile 13 wird der WMI Permanent Event Consumer unter der Bezeichnung
Den folgenden Code z.B. als
Hier jetzt das Event Handler Script. Es wird jedesmal aufgerufen, wenn im zu überwachenden Verzeichnis eine Datei mit dem vorbestimmten Typ (hier JPG) angelegt wird. Pfad und Name der erstellten Datei werden dem Script als Parameter übergeben und sind über
Die Daten in den Zeilen 4 bis 7 müssen eingetragen werden. Das ganze funktioniert nur, wenn das Benutzerkonto, unter dem der geplante Task zum verschieben der Bilddateien läuft, ein Passwort hat.
Für Testzwecke habe ich zusätzlich zu den Intervallen
Das Script errechnet anhand des Dateinamens den gewünschten Zeitpunkt, zu dem die Bilddatei verschoben werden soll und legt einen geplanten Task an, der diese Aufgabe ausführt. Der Name dieses Tasks setzt sich aus dem String in Zeile 28, dem Dateinamen der zu verschiebenden Datei und Datum und Uhrzeit, zu der die Datei verschoben werden soll, zusammen.
Falls vergessen wurde, im Betreff der EMail, mit der das Bild als Anhang verschickt wurde, eine Zahl anzugeben oder beim Intervall ein Tippfehler passierte und es deshalb nicht erkannt werden kann, wird das Script abbrechen und keinen geplanten Task anlegen. Das Bild wird dann zwar in der Diashow von IrfanView angezeigt aber nicht automatisch verschoben. Dadurch ist es auch möglich, ein Bild in das Verzeichnis zu kopieren, dessen Name den genannten Konventionen nicht entspricht und als Default-Bild zu verwenden, da IrfanView abbricht, wenn das beim Parameter
Um den Task anzulegen, wird eine XML-Datei als Vorlage verwendet, wie sie von der Aufgabenplanung seit Vista im-/exportiert werden kann. In dieser XML-Datei sind alle relevanten Einstellungen des geplanten Tasks eingetragen, auch das Kommando, das ausgeführt werden soll.
Das Script lädt diese XML-Datei, führt für jeden neuen Task die notwendigen Änderungen an der Vorlage durch (Erstellungszeit des Tasks, Startzeit des Tasks, Ablaufzeit des Tasks, Pfad und Name der zu verschiebenden Datei, Verzeichnis in das die Datei verschoben werden soll, Autor des Tasks inkl. Rechnername) und speichert sie unter einem neuen Namen. Dann wird mit dem Konsolenprogramm
Nach der Erstellung des Tasks wird die dafür erzeugte XML-Datei sofort wieder gelöscht.
Wenn der Task gestartet wird, wird CMD aufgerufen und mit dem Parameter
Das Event Handler Script kann auch nachträglich verändert werden, wenn der Permanent Event Consumer schon installiert ist. Falls es in einem Unterverzeichnis von
Falls im Installer Script kein anderer Wert in Zeile 13 eingetragen wurde, muss das Event Handler Script unter dem Namen
Zum Schluss noch der Inhalt der XML-Datei, die als Vorlage für die Konfigurationsdateien der zu erstellenden Tasks dient. Dieser Code muss als Unicode-Datei (UTF-16 Little Endian) gespeichert werden, damit die Aufgabenplanung die erzeugten Dateien importieren kann!. Im Falle von Notepad als dem verwendeten Texteditor kann man die Codierung im Dialog
Die Datei unter dem Namen speichern, der in Zeile 28 des Event Handler Scripts angegeben ist, hier also
Wenn die Dateien angepasst und gespeichert wurden, sind noch folgende Schritte durchzuführen:
Es erscheint im Normalfall keine Ausgabe. Das Installer-Script kann jetzt gelöscht werden.
Die nächste JPG-Datei, die in
Testweise habe ich auch noch etwas äquivalentes als Batchscript geschrieben. Durch das Monitoring des Bilder-Verzeichnisses wurde ein Kern meiner Intel Core i5 760 CPU (4x2.8GHz) zu 80% ausgelastet (Wärme, Stromverbrauch...). Die obige Lösung verursacht keinerlei auffällige CPU-Belastung, der Taskmanager zeigt eine normale Grundlast von 3-5% an .
Gruß
Friemler
mir war heute etwas langweilig, deshalb habe ich das Event Handler Script trotzdem geschrieben .
Voraussetzungen
- In dieser Form nur lauffähig ab Windows Vista.
- Das Benutzerkonto, unter dem der geplante Task ausgeführt wird, muss ein Passwort haben.
Erstmal der Installer. Ich habe den Pfad des zu überwachenden Verzeichnisses in Zeile 14 auf
C:\Users\Benutzer\Documents\Automatische Diashow
und den Dateityp der Bilder, die dort von Thunderbird abgelegt werden, auf *.jpg
festgelegt. Bei Bedarf ändern.Wegen Zeile 13 wird der WMI Permanent Event Consumer unter der Bezeichnung
New Picture File Creation Commandline Event Consumer
und der Event Filter unter New Picture File Creation Event Filter
registriert. Aus Zeile 13 ergibt sich außerdem der Name des Event Handler Scripts, es muss in dem Fall als NewPictureFileCreationEventHandler.vbs
gespeichert werden.Den folgenden Code z.B. als
Installer.vbs
speichern.' ===========================================
' Run this script with administrative rights!
' ===========================================
'/////////////////////////////// Configure script's job ///////////////////////////////
'******************** Customize according to your specific needs **********************
'------------------ Set event description and job related variables -------------------
strEventDescription = "New Picture File Creation"
strMonitorFileSpec = "C:\Users\Benutzer\Documents\Automatische Diashow\*.jpg"
strPollingIntervall = "1"
'---------------- Prepare Monitor Filespec for WMI Event Filter query -----------------
Set FSO = CreateObject("Scripting.FileSystemObject")
strDrive = FSO.GetDriveName(strMonitorFileSpec)
strFileName = FSO.GetFileName(strMonitorFileSpec)
intPathBegin = Len(strDrive) + 1
intPathLen = Len(strMonitorFileSpec) - Len(StrDrive) - Len(strFileName)
strPath = Replace(Mid(strMonitorFileSpec, intPathBegin, intPathLen), "\", "\\")
strExtension = FSO.GetExtensionName(strMonitorFileSpec)
Set FSO = Nothing
'----------------------------- Set WMI Event Filter query -----------------------------
strEventFilterQuery = "SELECT * FROM __InstanceCreationEvent" _
& " WITHIN " & strPollingIntervall _
& " WHERE TargetInstance ISA 'CIM_DataFile'" _
& " AND TargetInstance.Drive='" & strDrive & "'" _
& " AND TargetInstance.Path='" & strPath & "'" _
& " AND TargetInstance.Extension='" & strExtension & "'"
'-------------- Set WMI Namespace where the monitored event will occure ---------------
strEventNamespace = "root\Cimv2"
'----------- Set parameters which should be passed to Event Handler script ------------
strEventHandlerParam = """" _
& "%TargetInstance.Drive%" _
& "%TargetInstance.Path%" _
& "%TargetInstance.FileName%" _
& "." _
& "%TargetInstance.Extension%" _
& """"
'**************************************************************************************
'//////////////////////////////// Set script variables ////////////////////////////////
'- Set Event Handler path, quote it and prepare it and its working directory for WMI --
Set FSO = CreateObject("Scripting.FileSystemObject")
strEventHandlerWD = Replace(FSO.GetParentFolderName(WScript.ScriptFullName), "\", "\\")
strEventHandler = Replace(strEventDescription, " ", "") & "EventHandler.vbs"
strEventHandler = """" & strEventHandlerWD & "\\" & strEventHandler & """"
Set FSO = Nothing
'----------------------- Test for existing Event Handler script -----------------------
Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.FileExists(Replace(Replace(strEventHandler, "\\", "\"), """", "")) Then
MsgBox "The Event Handler script " & vbCRLF _
& Replace(strEventHandler, "\\", "\") & vbCRLF _
& "does not exist. Please create it.", _
vbExclamation, _
"Missing Event Handler script"
End If
Set FSO = Nothing
'-------------------------- Build parameters for CScript.exe --------------------------
strCScriptParam = strEventHandler & " " & strEventHandlerParam
'---------------- Get path of Windows Directory and prepare it for WMI ----------------
Set WshShell = WScript.CreateObject("WScript.Shell")
strWinDir = Replace(WshShell.ExpandEnvironmentStrings("%SystemRoot%"), "\", "\\")
Set WshShell = Nothing
'---------------------- Set path of CScript.exe prepared for WMI ----------------------
setCScriptPath = strWinDir & "\\System32\\cscript.exe"
'////////////////////////// Install permanent Event Consumer //////////////////////////
'------- Get WMI Scripting API object (SWbemServices), Namespace: Subscription --------
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" _
& "\\" & strComputer & "\root\Subscription")
'------------------------------ Create the Event Filter -------------------------------
Set objFilterClass = objWMIService.Get("__EventFilter")
Set objFilter = objFilterClass.SpawnInstance_()
objFilter.Name = strEventDescription & " Event Filter"
objFilter.EventNamespace = strEventNamespace
objFilter.QueryLanguage = "WQL"
objFilter.Query = strEventFilterQuery
Set EventFilterPath = objFilter.Put_()
'----------------------- Create the Commandline Event Consumer ------------------------
Set objEventConsumerClass = objWMIService.Get("CommandLineEventConsumer")
Set objEventConsumer = objEventConsumerClass.SpawnInstance_()
objEventConsumer.Name = strEventDescription & " Commandline Event Consumer"
objEventConsumer.CommandLineTemplate = setCScriptPath & " " & strCScriptParam
objEventConsumer.ExecutablePath = setCScriptPath
objEventConsumer.WorkingDirectory = strEventHandlerWD
objEventConsumer.ShowWindowCommand = 0
Set CommandlineEventConsumerPath = objEventConsumer.Put_()
'------------------ Bind Event Filter to Commandline Event Consumer -------------------
Set objBindingClass = objWMIService.Get("__FilterToConsumerBinding")
Set objBinding = objBindingClass.SpawnInstance_()
objBinding.Filter = EventFilterPath
objBinding.Consumer = CommandlineEventConsumerPath
objBinding.Put_()
Hier jetzt das Event Handler Script. Es wird jedesmal aufgerufen, wenn im zu überwachenden Verzeichnis eine Datei mit dem vorbestimmten Typ (hier JPG) angelegt wird. Pfad und Name der erstellten Datei werden dem Script als Parameter übergeben und sind über
WScript.Arguments(0)
verfügbar.Die Daten in den Zeilen 4 bis 7 müssen eingetragen werden. Das ganze funktioniert nur, wenn das Benutzerkonto, unter dem der geplante Task zum verschieben der Bilddateien läuft, ein Passwort hat.
Für Testzwecke habe ich zusätzlich zu den Intervallen
Tage
und Stunden
noch das Intervall Minuten
implementiert. Die Dateinamen können aus einer (ein- oder mehrstelligen) Zahl X und einem Intervall bestehen. Bei der Schreibweise des Intervalls wird Groß-/Kleinschreibung nicht beachtet. Außerdem ist es egal, ob man Minute/Minuten, Stunde/Stunden oder Tag/Tage verwendet. Zwischen der Zahl und dem Intervall kann, muss aber nicht, ein oder mehrere Leerzeichen stehen. Nach dem Intervall können noch beliebige andere Zeichen stehen.Das Script errechnet anhand des Dateinamens den gewünschten Zeitpunkt, zu dem die Bilddatei verschoben werden soll und legt einen geplanten Task an, der diese Aufgabe ausführt. Der Name dieses Tasks setzt sich aus dem String in Zeile 28, dem Dateinamen der zu verschiebenden Datei und Datum und Uhrzeit, zu der die Datei verschoben werden soll, zusammen.
Falls vergessen wurde, im Betreff der EMail, mit der das Bild als Anhang verschickt wurde, eine Zahl anzugeben oder beim Intervall ein Tippfehler passierte und es deshalb nicht erkannt werden kann, wird das Script abbrechen und keinen geplanten Task anlegen. Das Bild wird dann zwar in der Diashow von IrfanView angezeigt aber nicht automatisch verschoben. Dadurch ist es auch möglich, ein Bild in das Verzeichnis zu kopieren, dessen Name den genannten Konventionen nicht entspricht und als Default-Bild zu verwenden, da IrfanView abbricht, wenn das beim Parameter
/slideshow="xxxx"
angegebene Verzeichnis leer ist.Um den Task anzulegen, wird eine XML-Datei als Vorlage verwendet, wie sie von der Aufgabenplanung seit Vista im-/exportiert werden kann. In dieser XML-Datei sind alle relevanten Einstellungen des geplanten Tasks eingetragen, auch das Kommando, das ausgeführt werden soll.
Das Script lädt diese XML-Datei, führt für jeden neuen Task die notwendigen Änderungen an der Vorlage durch (Erstellungszeit des Tasks, Startzeit des Tasks, Ablaufzeit des Tasks, Pfad und Name der zu verschiebenden Datei, Verzeichnis in das die Datei verschoben werden soll, Autor des Tasks inkl. Rechnername) und speichert sie unter einem neuen Namen. Dann wird mit dem Konsolenprogramm
SCHTASKS
diese Datei in die Aufgabenplanung importiert (durch den Parameter /xml
). Das Benutzerkonto (inkl. Passwort), unter dem der Task ausgeführt werden soll, muss beim Aufruf von SCHTASKS
mit /ru
bzw. /rp
angegeben werden, lässt sich also nicht in die Vorlagen-Datei eintragen.Nach der Erstellung des Tasks wird die dafür erzeugte XML-Datei sofort wieder gelöscht.
Wenn der Task gestartet wird, wird CMD aufgerufen und mit dem Parameter
/c
angewiesen, den in der Parameterliste danach stehenden Befehl auszuführen, hier ein simples MOVE "Laufwerk:\Pfad\Bilddatei.jpg" "Laufwerk:\Pfad"
. Nachdem der Task ausgeführt wurde, wird er aufgrund von Einstellungen in der importierten XML-Datei von der Aufgabenplanung selbsttätig gelöscht.Das Event Handler Script kann auch nachträglich verändert werden, wenn der Permanent Event Consumer schon installiert ist. Falls es in einem Unterverzeichnis von
C:\Program Files
abgelegt wurde, muss der verwendete Editor jedoch mit Adminrechten gestartet werden. Außerdem noch der Hinweis, dass das Event Handler Script um Missbrauch zu vermeiden durch das setzen von NTFS-Zugriffsrechten gegen Veränderung bzw. Überschreiben durch User mit normalen Benutzerrechten geschützt werden sollte, da es unter dem SYSTEM-Konto mit höchsten Berechtigungen ausgeführt wird!Falls im Installer Script kein anderer Wert in Zeile 13 eingetragen wurde, muss das Event Handler Script unter dem Namen
NewPictureFileCreationEventHandler.vbs
gespeichert werden.'***************************************************
'Konfiguration
'***************************************************
scHost = "Computername"
scUser = "Benutzername"
scPassword = "Passwort"
scDestDir = "ZielverzeichnisZumVerschiebenAlterBilddateien"
'***************************************************
'Konstanten für Datei-IO
'***************************************************
icForReading = 1
icForWriting = 2
icAsUnicode = -1
'***************************************************
'Stringkonstanten
'***************************************************
'Zeitintervalle im Namen der zu verschiebenden Datei
scMinute = "minute"
scHour = "stunde"
scDay = "tag"
'Name der XML-Vorlagendatei für geplante Tasks
scTaskXMLFile = "MoveFile.xml"
'***************************************************
'Reguläre Ausdrücke zur Stringanalyse und -manipulation
'***************************************************
'Zur Analyse des Namens der neu erzeugten und später zu verschiebenden Datei
scPictureFileNamePattern = "([0-9]{1,})\s*(" & scMinute & "|" & scHour & "|" & scDay & ")"
'Zur Manipulation der Author-Zeile
'in der XML-Vorlagendatei für geplante Tasks
scAuthorLinePattern = "(\s*<Author>)[A-Z0-9_-]{1,}\\[A-Z0-9_-]{1,}(</Author>)"
'Zur Manipulation der Date-, StartBoundary- und EndBoundary-Zeile
'in der XML-Vorlagendatei für geplante Tasks
scDatePattern = "[0-9]{4}-[0-9]{2}-[0-9]{2}"
scTimePattern = "[0-9]{2}:[0-9]{2}:[0-9]{2}"
scDateLinePattern = "(\s*<Date>)" & scDatePattern & "T" & scTimePattern & "\.[0-9]{1,}(</Date>)"
scStartBoundaryLinePattern = "(\s*<StartBoundary>)" & scDatePattern & "T" & scTimePattern & "(</StartBoundary>)"
scEndBoundaryLinePattern = "(\s*<EndBoundary>)" & scDatePattern & "T" & scTimePattern & "(</EndBoundary>)"
'Zur Manipulation der Arguments-Zeile
'in der XML-Vorlagendatei für geplante Tasks
scArgumentsLinePattern = "(\s*<Arguments>/c ""move "").{1,}("" "").{1,}(""""</Arguments>)"
'***************************************************
'Benötigte Objekte erzeugen, Variablen setzen
'***************************************************
'Shell- und FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
'Objekt für Reguläre Ausdrücke
Set objRegExp = New RegExp
objRegExp.Global = False
objRegExp.IgnoreCase = True
'Pfad und Name der neu angelegten und später zu verschiebenden Datei
'aus dem ersten übergebenen Parameter bestimmen
strPictureFileName = WScript.Arguments(0)
'Pfad, unter dem das Script gespeichert ist.
'Hier muss auch die XML-Vorlagendatei für geplante Tasks abgelegt sein.
'Die XML-Datei für den zu erzeugenden geplanten Task wird auch hier erstellt,
'nach Verwendung aber sofort wieder gelöscht
strActFolder = objFSO.GetParentFolderName(WScript.ScriptFullName)
'Die aktuelle Zeit
vntNow = Now
'****************************************************
'Aus dem Namen der neu erstellten Datei den Zeitpunkt
'bestimmen, wann sie verschoben werden soll
'****************************************************
'Zahl und Intervall extrahieren
objRegExp.Pattern = scPictureFileNamePattern
Set colMatches = objRegExp.Execute(objFSO.GetBaseName(strPictureFileName))
intQuantity = colMatches(0).SubMatches(0)
strInterval = colMatches(0).SubMatches(1)
'Zeitpunkt zum Verschieben berechnen
Select Case LCase(strInterval)
Case scDay strMoveDate = CStr(DateAdd("d", intQuantity, vntNow))
Case scHour strMoveDate = CStr(DateAdd("h", intQuantity, vntNow))
Case scMinute strMoveDate = CStr(DateAdd("n", intQuantity, vntNow))
End Select
'****************************************************
'Pfad und Name der XML-Datei für den zu erzeugenden
'geplanten Task zusammensetzen
'****************************************************
strNewTaskXMLFile = objFSO.BuildPath(strActFolder, objFSO.GetBaseName(scTaskXMLFile) & " " & objFSO.GetFileName(strPictureFileName) & " " & Replace(strMoveDate, ":", "-") & "." & objFSO.GetExtensionName(scTaskXMLFile))
'***************************************************
'Die XML-Vorlagendatei für geplante Tasks einlesen
'***************************************************
Set objXMLFile = objFSO.OpenTextFile(objFSO.BuildPath(strActFolder, scTaskXMLFile), icForReading, False, icAsUnicode)
strScheduledTask = objXMLFile.ReadAll
objXMLFile.Close
'***************************************************
'Die variabelen Zeilen mit konkreten Werten füllen
'***************************************************
'Die Author-Zeile (Ersteller des geplanten Tasks,
'in diesem Fall immer das System-Konto)
objRegExp.Pattern = scAuthorLinePattern
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches
strScheduledTask = objRegExp.Replace(strScheduledTask, colSubMatches(0) & scHost & "\System" & colSubMatches(1))
'Die Date-Zeile (Zeitpunkt der Erstellung)
objRegExp.Pattern = scDateLinePattern
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches
strScheduledTask = objRegExp.Replace(strScheduledTask, colSubMatches(0) & GetDateUS(vntNow) & "T" & GetTimeUS(vntNow) & ".0000000" & colSubMatches(1))
'Die StartBoundary-Zeile (Zeitpunkt der Ausführung)
objRegExp.Pattern = scStartBoundaryLinePattern
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches
strScheduledTask = objRegExp.Replace(strScheduledTask, colSubMatches(0) & GetDateUS(strMoveDate) & "T" & GetTimeUS(strMoveDate) & colSubMatches(1))
'Die EndBoundary-Zeile (Zeitpunkt, zu dem der Task enden soll)
'Wird auf den gleichen Wert wie die Start-Zeit gesetzt.
'Dadurch wird der geplante Task sofort ungültig und wegen der
'Einstellung "DeleteExpiredTaskAfter" mit dem Wert "PT0S"
'(steht für "Sofort") direkt gelöscht.
objRegExp.Pattern = scEndBoundaryLinePattern
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches
strScheduledTask = objRegExp.Replace(strScheduledTask, colSubMatches(0) & GetDateUS(strMoveDate) & "T" & GetTimeUS(strMoveDate) & colSubMatches(1))
'Die Zeile mit den Argumenten für den CMD-Aufruf.
'Es wird Pfad und Name der zu verschiebenden Datei
'und das Zielverzeichnis eingetragen.
objRegExp.Pattern = scArgumentsLinePattern
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches
strScheduledTask = objRegExp.Replace(strScheduledTask, colSubMatches(0) & strPictureFileName & colSubMatches(1) & scDestDir & colSubMatches(2))
'***************************************************
'Die XML-Datei unter neuem Namen speichern
'***************************************************
Set objXMLFile = objFSO.OpenTextFile(strNewTaskXMLFile, icForWriting, True, icAsUnicode)
objXMLFile.Write strScheduledTask
objXMLFile.Close
'***************************************************
'Unter Verwendung der erzeugten XML-Datei einen
'geplanten Task anlegen. Der Benutzer, unter dessen
'Kontext das aufgerufene Programm (CMD) ausgeführt
'werden soll, und dessen Passwort MUSS hier über die
'Parameter von SchTasks.exe gesetzt werden
'***************************************************
objShell.Run "schtasks /create /ru """ & scHost & "\" & scUser & """ /rp """ & scPassword & """ /tn """ & objFSO.GetBaseName(strNewTaskXMLFile) & """ /xml """ & strNewTaskXMLFile & """" , 0, True
'***************************************************
'Die XML-Datei wieder löschen
'***************************************************
objFSO.DeleteFile(strNewTaskXMLFile)
'-----------------------ENDE------------------------
'***************************************************
'Datumsstring im Format YYYY-MM-DD erzeugen
'***************************************************
Function GetDateUS(vntNow)
GetDateUS = Year(vntNow) & "-" & Right("0" & Month(vntNow), 2) & "-" & Right("0" & Day(vntNow), 2)
End Function
'***************************************************
'Uhrzeitstring im Format HH:MM:SS erzeugen
'***************************************************
Function GetTimeUS(vntNow)
GetTimeUS = Right("0" & Hour(vntNow), 2) & ":" & Right("0" & Minute(vntNow), 2) & ":" & Right("0" & Second(vntNow), 2)
End Function
Zum Schluss noch der Inhalt der XML-Datei, die als Vorlage für die Konfigurationsdateien der zu erstellenden Tasks dient. Dieser Code muss als Unicode-Datei (UTF-16 Little Endian) gespeichert werden, damit die Aufgabenplanung die erzeugten Dateien importieren kann!. Im Falle von Notepad als dem verwendeten Texteditor kann man die Codierung im Dialog
Speichern unter..
im Feld Codierung
angeben. Hier Unicode
auswählen.Die Datei unter dem Namen speichern, der in Zeile 28 des Event Handler Scripts angegeben ist, hier also
MoveFile.xml
.<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>0000-00-00T00:00:00.0000000</Date>
<Author>Host\System</Author>
</RegistrationInfo>
<Triggers>
<TimeTrigger>
<StartBoundary>0000-00-00T00:00:00</StartBoundary>
<EndBoundary>0000-00-00T00:00:00</EndBoundary>
<Enabled>true</Enabled>
</TimeTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>Host\User</UserId>
<LogonType>S4U</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>false</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<DeleteExpiredTaskAfter>PT0S</DeleteExpiredTaskAfter>
<Priority>7</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>3</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>cmd</Command>
<Arguments>/c "move "AAA.BBB" "CCC.DDD""</Arguments>
</Exec>
</Actions>
</Task>
Wenn die Dateien angepasst und gespeichert wurden, sind noch folgende Schritte durchzuführen:
- Das Verzeichnis, in dem neu erstellte Bilder gespeichert werden sollen, unter dem Pfad und Namen anlegen, der im Installer Script in Zeile 14 angegeben wurde.
- Das Verzeichnis anlegen, in das die alten Bilder verschoben werden sollen (wurde im Event Handler Script in Zeile 7 eingetragen).
- Ein Verzeichnis anlegen (z.B.
C:\Program Files\Automatische Diashow
) und das Installer Script, das Event Handler Script und die XML-Datei dort hineinkopieren. - Eine Kommandozeile (CMD.exe) über "Rechtsklick -> Als Administrator ausführen..." starten und mit CD in das eben erstellte Verzeichnis wechseln (z.B.
CD "C:\Program Files\Automatische Diashow"
). - In der Kommandozeile folgenden Befehl ausführen:
cscript /nologo Installer.vbs
Die nächste JPG-Datei, die in
C:\Users\Benutzer\Documents\Automatische Diashow
neu erstellt wird (z.B. "1 Minute.jpg", "5Minuten.jpg", "1 Stunde.jpg", "3Stunden.jpg", "1Tag.jpg" oder auch "3 Tage.jpg") wird nach der im Dateinamen angegebenen Zeitspanne ins angegebene Zielverzeichnis verschoben.Testweise habe ich auch noch etwas äquivalentes als Batchscript geschrieben. Durch das Monitoring des Bilder-Verzeichnisses wurde ein Kern meiner Intel Core i5 760 CPU (4x2.8GHz) zu 80% ausgelastet (Wärme, Stromverbrauch...). Die obige Lösung verursacht keinerlei auffällige CPU-Belastung, der Taskmanager zeigt eine normale Grundlast von 3-5% an .
Gruß
Friemler
Hallo Bründl,
OK, hier die Super-Einfach-Lösung, aber in VBScript. Das ist mir in Batchscript zu umständlich
Eine Datei, die am 01.08.2011 um 23:59:30 mit dem Namen
Wenn Du den Task erstellst, muss als Programm
Gruß
Friemler
OK, hier die Super-Einfach-Lösung, aber in VBScript. Das ist mir in Batchscript zu umständlich
scMonitoredFolder = "E:\Test"
scDestFolder = "E:\Ziel"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = New RegExp
objRegExp.Global = False
objRegExp.IgnoreCase = True
objRegExp.Pattern = "([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}).*\..*"
intYearNow = Year(Now)
intMonthNow = Month(Now)
intDayNow = Day(Now)
For Each objFile In objFSO.GetFolder(scMonitoredFolder).Files
Set colMatches = objRegExp.Execute(objFile.Name)
If colMatches.Count > 0 Then
intYearFile = CInt(colMatches(0).SubMatches(0))
intMonthFile = CInt(colMatches(0).SubMatches(1))
intDayFile = CInt(colMatches(0).SubMatches(2))
If (intYearFile = intYearNow) And (intMonthFile = intMonthNow) And (intDayFile = intDayNow) Then
objFile.Move(objFSO.BuildPath(scDestFolder, objFile.Name))
End If
End If
Next
Eine Datei, die am 01.08.2011 um 23:59:30 mit dem Namen
2011-08-02.jpg
angelegt wird, wird dann aber spätestens 15 Minuten später schon wieder verschoben, je nach dem in welchem Intervall Du den geplanten Task laufen lässt.Wenn Du den Task erstellst, muss als Programm
cscript.exe
angegeben werden und als Parameter /nologo "Pfad+NameDesScripts.vbs"
.Gruß
Friemler