bruendl
Goto Top

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

Content-Key: 170641

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: Friemler
Friemler Jul 29, 2011 at 14:32:16 (UTC)
Goto Top
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
Member: Bruendl
Bruendl Jul 29, 2011 at 14:46:38 (UTC)
Goto Top
Hmmm... Fragen über Frage face-wink
Ich weiß nicht genau wie es realisierbar ist, aber ich würde es am liebsten recht einfach halten was die Zeitintervalle angeht. So gesehen wäre mir Stunden auch recht. Das verschieben der Dateien würde ich hingegen gerne recht zeitnah geschehen lassen. Bei dem Fall dass Dateien mehrfach "3 Tage" heißen wird eine 1 angehängt.

Gruß
Bründl
Member: Friemler
Friemler Jul 29, 2011 at 15:02:54 (UTC)
Goto Top
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
Member: Bruendl
Bruendl Jul 29, 2011 at 15:36:09 (UTC)
Goto Top
Bei dem Rechner handelt es sich um ein:

TERRA PC-NETTOP 2500 GREENLINE
Intel Atom 230 CPU on Board 1,6 GHz
2 GB DDR2-RAM PC667
320GB SATA-II
NVIDIA ION GPU Geforce 9400

OS: Win7 32Bit

Das System soll bei einem Kunden von uns eingebaut werden und ist NUR für die Diashow via E-Mail gedacht.

An deinem Lösungsansatz bin ich durchaus interessiert. Leider kenne ich mich nicht mit VBScripts aus sondern nur ein wenig mit Batch-Dateien.
Du sagtest außerem die Prozessorlast sei recht hoch, bei einer Batch-Datei-Lösung, aber wenn der PC sowieso nur für den Zweck der Diashow da ist, könnte einem das doch egal sein oder?


Gruß
Bründl
Member: Friemler
Friemler Jul 29, 2011 at 15:51:18 (UTC)
Goto Top
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 face-wink .

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
Member: Bruendl
Bruendl Jul 29, 2011 at 16:09:11 (UTC)
Goto Top
Warte, ich habe noch einen Lösungsansatz von einem Bekannten via Batch-Datei den ich gerne ausprobieren möchte. Ich melde mich einfach noch einmal am Montag ist ja auch schon so gut wie Feierabend.

Vielen dank für deine Bemühungen bis jetzt face-wink#

Gruß Bründl
Member: Friemler
Friemler Jul 31, 2011 at 20:17:07 (UTC)
Goto Top
Hallo Bründl,

mir war heute etwas langweilig, deshalb habe ich das Event Handler Script trotzdem geschrieben face-wink .

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
Es erscheint im Normalfall keine Ausgabe. Das Installer-Script kann jetzt gelöscht werden.

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 face-smile .


Gruß
Friemler
Member: Bruendl
Bruendl Aug 01, 2011 at 07:40:09 (UTC)
Goto Top
Wow das sieht ja nach viel Arbeit aus. Ich werde es auch einmal in betracht ziehen und dir von meinem Ergebnis berichten.

Vielen herzlichen Dank schon einmal ;)

Gruß

Bründl
Member: Bruendl
Bruendl Aug 01, 2011 at 09:40:49 (UTC)
Goto Top
Okay bevor ich deine Methode ausprobiere, würde ich gerne eine für mich recht einfach anhörende Lösung von meinem Kumpel ausprobieren. Und zwar was ist wenn ich die Datei, welche ich per Mail versende, einfach immer mit dem Datum benenne an welchem Tag die Datei verschoben werden soll? z.B.: 2011-08-01? Dann packe ich eine Batch-Datei in den Taskplaner, die alle 15Min ausgeführt wird und dann quasi prüft, ob Dateiname=Heutiges Datum ist und dann verschoben werden soll. Ich weiß jetzt nicht in wie fern ich die Dateiendungen mit einbeziehen muss und eine Variable im Datum muss doch auch irgendwie mit rein, weil wenn ich mehrere Bilder verschicke heißen die dann ja: 2011-08-01(1), 2011-08-01(2),... usw.

Hast du vielleicht in der Richtung einen Lösungsansatz?

Gruß

Bründl
Member: Friemler
Friemler Aug 01, 2011 at 10:47:38 (UTC)
Goto Top
Hallo Bründl,

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
Member: Bruendl
Bruendl Aug 01, 2011 at 11:08:15 (UTC)
Goto Top
Hi Friemler,

immer wieder diese VBScripte :D. Wird wohl mein nächstes Projekt mich damit mal intensive auseinadner zu setzen.

Leider funtioniert es noch nicht ganz face-sad und zwar bekomme ich drei Fenster wo ich OK klicken muss. Da steht drin: 2011-2011, 8-8 und 1-1 (weiß nicht ob es dass soll, wäre aber doch blöd, da die Datei doch automatisch laufen soll, dann kommt ein Fehler:
Skript: Pfad.....
Zeile: 29
Zeichen: 7
Fehler: die Datei ist bereits vorhanden
Code: 800A003A
Quelle: Laufzeitfehler in MS VBScript
Member: Friemler
Friemler Aug 01, 2011 at 11:25:06 (UTC)
Goto Top
Hallo Bründl,

sorry, das kommt davon wenn man nachträglich den Code ändert ohne zu testen. Ich hatte die Datei zuerst gelöscht und erst später den MOVE-Befehl eingefügt. Das Script ist schon korrigiert, bitte den Code nochmal kopieren.

Gruß
Friemler
Member: Bruendl
Bruendl Aug 01, 2011 at 12:47:19 (UTC)
Goto Top
Yeah den kurz Test hat es auf jeden Fall bestanden, ich muss jetzt noch den Rechner herrichten und das dann auch testen. Werde dir auf jeden Fall von meinem Ergebnis berichten.

Vielen Dank für deine Mühen

Gruß
Bründl
Member: Bruendl
Bruendl Aug 01, 2011 at 13:44:15 (UTC)
Goto Top
Der Diashow PC funktioniert einwandfreiface-smile Werde mich jetzt auch einmal etwas intensiver mit dem Thema Visual Basic befassen und mir dann dein Script noch einmal zu gemüte führen um es hoffentlich zu verstehen.

Noch einmal vielen Dank für deine Bemühungen.

Gruß
Bründl
Member: Friemler
Friemler Aug 01, 2011 at 13:48:14 (UTC)
Goto Top
Hallo Bründl,

schön zu hören. Dann markiere den Beitrag doch bitte noch als gelöst.

Gruß
Friemler