Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Automatisierte Diashow

Frage Entwicklung

Mitglied: Bruendl

Bruendl (Level 1) - Jetzt verbinden

29.07.2011 um 16:15 Uhr, 5218 Aufrufe, 15 Kommentare

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
Mitglied: Friemler
29.07.2011 um 16:32 Uhr
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
Bitte warten ..
Mitglied: Bruendl
29.07.2011 um 16:46 Uhr
Hmmm... Fragen über Frage
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
Bitte warten ..
Mitglied: Friemler
29.07.2011 um 17:02 Uhr
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
Bitte warten ..
Mitglied: Bruendl
29.07.2011 um 17:36 Uhr
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
Bitte warten ..
Mitglied: Friemler
29.07.2011 um 17:51 Uhr
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 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
Bitte warten ..
Mitglied: Bruendl
29.07.2011 um 18:09 Uhr
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 #

Gruß Bründl
Bitte warten ..
Mitglied: Friemler
31.07.2011 um 22:17 Uhr
Hallo Bründl,

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.
01.
' =========================================== 
02.
' Run this script with administrative rights! 
03.
' =========================================== 
04.
 
05.
 
06.
 
07.
'/////////////////////////////// Configure script's job /////////////////////////////// 
08.
 
09.
'******************** Customize according to your specific needs ********************** 
10.
 
11.
'------------------ Set event description and job related variables ------------------- 
12.
 
13.
strEventDescription  = "New Picture File Creation" 
14.
strMonitorFileSpec   = "C:\Users\Benutzer\Documents\Automatische Diashow\*.jpg" 
15.
strPollingIntervall  = "1" 
16.
 
17.
 
18.
 
19.
'---------------- Prepare Monitor Filespec for WMI Event Filter query ----------------- 
20.
 
21.
Set FSO              = CreateObject("Scripting.FileSystemObject") 
22.
 
23.
strDrive             = FSO.GetDriveName(strMonitorFileSpec) 
24.
 
25.
strFileName          = FSO.GetFileName(strMonitorFileSpec) 
26.
intPathBegin         = Len(strDrive) + 1 
27.
intPathLen           = Len(strMonitorFileSpec) - Len(StrDrive) - Len(strFileName) 
28.
strPath              = Replace(Mid(strMonitorFileSpec, intPathBegin, intPathLen), "\", "\\") 
29.
 
30.
strExtension         = FSO.GetExtensionName(strMonitorFileSpec) 
31.
 
32.
Set FSO              = Nothing 
33.
 
34.
 
35.
 
36.
'----------------------------- Set WMI Event Filter query ----------------------------- 
37.
 
38.
strEventFilterQuery  = "SELECT * FROM __InstanceCreationEvent" _ 
39.
                     & " WITHIN " & strPollingIntervall _ 
40.
                     & " WHERE TargetInstance ISA 'CIM_DataFile'" _ 
41.
                     & " AND TargetInstance.Drive='" & strDrive & "'" _ 
42.
                     & " AND TargetInstance.Path='" & strPath & "'" _ 
43.
                     & " AND TargetInstance.Extension='" & strExtension & "'" 
44.
 
45.
 
46.
 
47.
'-------------- Set WMI Namespace where the monitored event will occure --------------- 
48.
 
49.
strEventNamespace    = "root\Cimv2" 
50.
 
51.
 
52.
 
53.
'----------- Set parameters which should be passed to Event Handler script ------------ 
54.
 
55.
strEventHandlerParam = """" _ 
56.
                     & "%TargetInstance.Drive%" _ 
57.
                     & "%TargetInstance.Path%" _ 
58.
                     & "%TargetInstance.FileName%" _ 
59.
                     & "." _ 
60.
                     & "%TargetInstance.Extension%" _ 
61.
                     & """" 
62.
 
63.
'************************************************************************************** 
64.
 
65.
 
66.
 
67.
 
68.
 
69.
'//////////////////////////////// Set script variables //////////////////////////////// 
70.
 
71.
'- Set Event Handler path, quote it and prepare it and its working directory for WMI -- 
72.
 
73.
Set FSO           = CreateObject("Scripting.FileSystemObject") 
74.
 
75.
strEventHandlerWD = Replace(FSO.GetParentFolderName(WScript.ScriptFullName), "\", "\\") 
76.
 
77.
strEventHandler   = Replace(strEventDescription, " ", "") & "EventHandler.vbs" 
78.
strEventHandler   = """" & strEventHandlerWD & "\\" & strEventHandler & """" 
79.
 
80.
Set FSO           = Nothing 
81.
 
82.
 
83.
 
84.
'----------------------- Test for existing Event Handler script ----------------------- 
85.
 
86.
Set FSO = CreateObject("Scripting.FileSystemObject") 
87.
 
88.
If Not FSO.FileExists(Replace(Replace(strEventHandler, "\\", "\"), """", "")) Then 
89.
  MsgBox "The Event Handler script " & vbCRLF _ 
90.
          & Replace(strEventHandler, "\\", "\") & vbCRLF _ 
91.
          & "does not exist. Please create it.", _ 
92.
         vbExclamation, _ 
93.
         "Missing Event Handler script" 
94.
End If 
95.
 
96.
Set FSO = Nothing 
97.
 
98.
 
99.
 
100.
'-------------------------- Build parameters for CScript.exe -------------------------- 
101.
 
102.
strCScriptParam = strEventHandler & " " & strEventHandlerParam 
103.
 
104.
 
105.
 
106.
'---------------- Get path of Windows Directory and prepare it for WMI ---------------- 
107.
 
108.
Set WshShell    = WScript.CreateObject("WScript.Shell") 
109.
 
110.
strWinDir       = Replace(WshShell.ExpandEnvironmentStrings("%SystemRoot%"), "\", "\\") 
111.
 
112.
Set WshShell    = Nothing 
113.
 
114.
 
115.
 
116.
'---------------------- Set path of CScript.exe prepared for WMI ---------------------- 
117.
 
118.
setCScriptPath  = strWinDir & "\\System32\\cscript.exe" 
119.
 
120.
 
121.
 
122.
 
123.
 
124.
'////////////////////////// Install permanent Event Consumer ////////////////////////// 
125.
 
126.
'------- Get WMI Scripting API object (SWbemServices), Namespace: Subscription -------- 
127.
 
128.
strComputer                          = "." 
129.
Set objWMIService                    = GetObject("winmgmts:" _ 
130.
                                                 & "{impersonationLevel=impersonate}!" _ 
131.
                                                 & "\\" & strComputer & "\root\Subscription") 
132.
 
133.
 
134.
 
135.
'------------------------------ Create the Event Filter ------------------------------- 
136.
 
137.
Set objFilterClass                   = objWMIService.Get("__EventFilter") 
138.
Set objFilter                        = objFilterClass.SpawnInstance_() 
139.
 
140.
objFilter.Name                       = strEventDescription & " Event Filter" 
141.
objFilter.EventNamespace             = strEventNamespace 
142.
objFilter.QueryLanguage              = "WQL" 
143.
objFilter.Query                      = strEventFilterQuery 
144.
 
145.
Set EventFilterPath                  = objFilter.Put_() 
146.
 
147.
 
148.
 
149.
'----------------------- Create the Commandline Event Consumer ------------------------ 
150.
 
151.
Set objEventConsumerClass            = objWMIService.Get("CommandLineEventConsumer") 
152.
Set objEventConsumer                 = objEventConsumerClass.SpawnInstance_() 
153.
 
154.
objEventConsumer.Name                = strEventDescription & " Commandline Event Consumer" 
155.
objEventConsumer.CommandLineTemplate = setCScriptPath & " " & strCScriptParam 
156.
objEventConsumer.ExecutablePath      = setCScriptPath 
157.
objEventConsumer.WorkingDirectory    = strEventHandlerWD 
158.
objEventConsumer.ShowWindowCommand   = 0 
159.
 
160.
Set CommandlineEventConsumerPath     = objEventConsumer.Put_() 
161.
 
162.
 
163.
 
164.
'------------------ Bind Event Filter to Commandline Event Consumer ------------------- 
165.
 
166.
Set objBindingClass                  = objWMIService.Get("__FilterToConsumerBinding") 
167.
Set objBinding                       = objBindingClass.SpawnInstance_() 
168.
 
169.
objBinding.Filter                    = EventFilterPath 
170.
objBinding.Consumer                  = CommandlineEventConsumerPath 
171.
 
172.
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.
01.
'*************************************************** 
02.
'Konfiguration 
03.
'*************************************************** 
04.
scHost     = "Computername" 
05.
scUser     = "Benutzername" 
06.
scPassword = "Passwort" 
07.
scDestDir  = "ZielverzeichnisZumVerschiebenAlterBilddateien" 
08.
 
09.
 
10.
 
11.
'*************************************************** 
12.
'Konstanten für Datei-IO 
13.
'*************************************************** 
14.
icForReading               = 1 
15.
icForWriting               = 2 
16.
icAsUnicode                = -1 
17.
 
18.
 
19.
'*************************************************** 
20.
'Stringkonstanten 
21.
'*************************************************** 
22.
'Zeitintervalle im Namen der zu verschiebenden Datei 
23.
scMinute                   = "minute" 
24.
scHour                     = "stunde" 
25.
scDay                      = "tag" 
26.
 
27.
'Name der XML-Vorlagendatei für geplante Tasks 
28.
scTaskXMLFile              = "MoveFile.xml" 
29.
 
30.
 
31.
'*************************************************** 
32.
'Reguläre Ausdrücke zur Stringanalyse und -manipulation 
33.
'*************************************************** 
34.
'Zur Analyse des Namens der neu erzeugten und später zu verschiebenden Datei 
35.
scPictureFileNamePattern   = "([0-9]{1,})\s*(" & scMinute & "|" & scHour & "|" & scDay & ")" 
36.
 
37.
'Zur Manipulation der Author-Zeile 
38.
'in der XML-Vorlagendatei für geplante Tasks 
39.
scAuthorLinePattern        = "(\s*<Author>)[A-Z0-9_-]{1,}\\[A-Z0-9_-]{1,}(</Author>)" 
40.
 
41.
'Zur Manipulation der Date-, StartBoundary- und EndBoundary-Zeile 
42.
'in der XML-Vorlagendatei für geplante Tasks 
43.
scDatePattern              = "[0-9]{4}-[0-9]{2}-[0-9]{2}" 
44.
scTimePattern              = "[0-9]{2}:[0-9]{2}:[0-9]{2}" 
45.
scDateLinePattern          = "(\s*<Date>)"          & scDatePattern & "T" & scTimePattern & "\.[0-9]{1,}(</Date>)" 
46.
scStartBoundaryLinePattern = "(\s*<StartBoundary>)" & scDatePattern & "T" & scTimePattern & "(</StartBoundary>)" 
47.
scEndBoundaryLinePattern   = "(\s*<EndBoundary>)"   & scDatePattern & "T" & scTimePattern & "(</EndBoundary>)" 
48.
 
49.
'Zur Manipulation der Arguments-Zeile 
50.
'in der XML-Vorlagendatei für geplante Tasks 
51.
scArgumentsLinePattern     = "(\s*<Arguments>/c ""move "").{1,}("" "").{1,}(""""</Arguments>)" 
52.
 
53.
 
54.
'*************************************************** 
55.
'Benötigte Objekte erzeugen, Variablen setzen 
56.
'*************************************************** 
57.
'Shell- und FileSystemObject 
58.
Set objFSO           = CreateObject("Scripting.FileSystemObject") 
59.
Set objShell         = CreateObject("WScript.Shell") 
60.
 
61.
'Objekt für Reguläre Ausdrücke 
62.
Set objRegExp        = New RegExp 
63.
objRegExp.Global     = False 
64.
objRegExp.IgnoreCase = True 
65.
 
66.
'Pfad und Name der neu angelegten und später zu verschiebenden Datei 
67.
'aus dem ersten übergebenen Parameter bestimmen 
68.
strPictureFileName   = WScript.Arguments(0) 
69.
 
70.
'Pfad, unter dem das Script gespeichert ist. 
71.
'Hier muss auch die XML-Vorlagendatei für geplante Tasks abgelegt sein. 
72.
'Die XML-Datei für den zu erzeugenden geplanten Task wird auch hier erstellt, 
73.
'nach Verwendung aber sofort wieder gelöscht 
74.
strActFolder         = objFSO.GetParentFolderName(WScript.ScriptFullName) 
75.
 
76.
'Die aktuelle Zeit 
77.
vntNow               = Now 
78.
 
79.
 
80.
'**************************************************** 
81.
'Aus dem Namen der neu erstellten Datei den Zeitpunkt 
82.
'bestimmen, wann sie verschoben werden soll 
83.
'**************************************************** 
84.
'Zahl und Intervall extrahieren 
85.
objRegExp.Pattern = scPictureFileNamePattern 
86.
Set colMatches    = objRegExp.Execute(objFSO.GetBaseName(strPictureFileName)) 
87.
intQuantity       = colMatches(0).SubMatches(0) 
88.
strInterval       = colMatches(0).SubMatches(1) 
89.
 
90.
'Zeitpunkt zum Verschieben berechnen 
91.
Select Case LCase(strInterval) 
92.
  Case scDay    strMoveDate = CStr(DateAdd("d", intQuantity, vntNow)) 
93.
  Case scHour   strMoveDate = CStr(DateAdd("h", intQuantity, vntNow)) 
94.
  Case scMinute strMoveDate = CStr(DateAdd("n", intQuantity, vntNow)) 
95.
End Select 
96.
 
97.
 
98.
'**************************************************** 
99.
'Pfad und Name der XML-Datei für den zu erzeugenden 
100.
'geplanten Task zusammensetzen 
101.
'**************************************************** 
102.
strNewTaskXMLFile = objFSO.BuildPath(strActFolder, objFSO.GetBaseName(scTaskXMLFile) & " " & objFSO.GetFileName(strPictureFileName) & " " & Replace(strMoveDate, ":", "-") & "." & objFSO.GetExtensionName(scTaskXMLFile)) 
103.
 
104.
 
105.
'*************************************************** 
106.
'Die XML-Vorlagendatei für geplante Tasks einlesen 
107.
'*************************************************** 
108.
Set objXMLFile   = objFSO.OpenTextFile(objFSO.BuildPath(strActFolder, scTaskXMLFile), icForReading, False, icAsUnicode) 
109.
strScheduledTask = objXMLFile.ReadAll 
110.
objXMLFile.Close 
111.
 
112.
 
113.
'*************************************************** 
114.
'Die variabelen Zeilen mit konkreten Werten füllen 
115.
'*************************************************** 
116.
'Die Author-Zeile (Ersteller des geplanten Tasks, 
117.
'in diesem Fall immer das System-Konto) 
118.
objRegExp.Pattern = scAuthorLinePattern 
119.
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches 
120.
strScheduledTask  = objRegExp.Replace(strScheduledTask, colSubMatches(0) & scHost & "\System" & colSubMatches(1)) 
121.
 
122.
'Die Date-Zeile (Zeitpunkt der Erstellung) 
123.
objRegExp.Pattern = scDateLinePattern 
124.
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches 
125.
strScheduledTask  = objRegExp.Replace(strScheduledTask, colSubMatches(0) & GetDateUS(vntNow) & "T" & GetTimeUS(vntNow) & ".0000000" & colSubMatches(1)) 
126.
 
127.
'Die StartBoundary-Zeile (Zeitpunkt der Ausführung) 
128.
objRegExp.Pattern = scStartBoundaryLinePattern 
129.
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches 
130.
strScheduledTask  = objRegExp.Replace(strScheduledTask, colSubMatches(0) & GetDateUS(strMoveDate) & "T" & GetTimeUS(strMoveDate) & colSubMatches(1)) 
131.
 
132.
'Die EndBoundary-Zeile (Zeitpunkt, zu dem der Task enden soll) 
133.
'Wird auf den gleichen Wert wie die Start-Zeit gesetzt. 
134.
'Dadurch wird der geplante Task sofort ungültig und wegen der 
135.
'Einstellung "DeleteExpiredTaskAfter" mit dem Wert "PT0S" 
136.
'(steht für "Sofort") direkt gelöscht. 
137.
objRegExp.Pattern = scEndBoundaryLinePattern 
138.
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches 
139.
strScheduledTask  = objRegExp.Replace(strScheduledTask, colSubMatches(0) & GetDateUS(strMoveDate) & "T" & GetTimeUS(strMoveDate) & colSubMatches(1)) 
140.
 
141.
'Die Zeile mit den Argumenten für den CMD-Aufruf. 
142.
'Es wird Pfad und Name der zu verschiebenden Datei 
143.
'und das Zielverzeichnis eingetragen. 
144.
objRegExp.Pattern = scArgumentsLinePattern 
145.
Set colSubMatches = objRegExp.Execute(strScheduledTask)(0).SubMatches 
146.
strScheduledTask  = objRegExp.Replace(strScheduledTask, colSubMatches(0) & strPictureFileName & colSubMatches(1) & scDestDir & colSubMatches(2)) 
147.
 
148.
 
149.
'*************************************************** 
150.
'Die XML-Datei unter neuem Namen speichern 
151.
'*************************************************** 
152.
Set objXMLFile = objFSO.OpenTextFile(strNewTaskXMLFile, icForWriting, True, icAsUnicode) 
153.
objXMLFile.Write strScheduledTask 
154.
objXMLFile.Close 
155.
 
156.
 
157.
'*************************************************** 
158.
'Unter Verwendung der erzeugten XML-Datei einen 
159.
'geplanten Task anlegen. Der Benutzer, unter dessen 
160.
'Kontext das aufgerufene Programm (CMD) ausgeführt 
161.
'werden soll, und dessen Passwort MUSS hier über die 
162.
'Parameter von SchTasks.exe gesetzt werden 
163.
'*************************************************** 
164.
objShell.Run "schtasks /create /ru """ & scHost & "\" & scUser & """ /rp """ & scPassword & """ /tn """ & objFSO.GetBaseName(strNewTaskXMLFile) & """ /xml """ & strNewTaskXMLFile & """" , 0, True 
165.
 
166.
 
167.
'*************************************************** 
168.
'Die XML-Datei wieder löschen 
169.
'*************************************************** 
170.
objFSO.DeleteFile(strNewTaskXMLFile) 
171.
 
172.
 
173.
'-----------------------ENDE------------------------ 
174.
 
175.
 
176.
 
177.
 
178.
'*************************************************** 
179.
'Datumsstring im Format YYYY-MM-DD erzeugen 
180.
'*************************************************** 
181.
Function GetDateUS(vntNow) 
182.
  GetDateUS = Year(vntNow) & "-" & Right("0" & Month(vntNow), 2) & "-" & Right("0" & Day(vntNow), 2) 
183.
End Function 
184.
 
185.
 
186.
'*************************************************** 
187.
'Uhrzeitstring im Format HH:MM:SS erzeugen 
188.
'*************************************************** 
189.
Function GetTimeUS(vntNow) 
190.
  GetTimeUS = Right("0" & Hour(vntNow), 2) & ":" & Right("0" & Minute(vntNow), 2) & ":" & Right("0" & Second(vntNow), 2) 
191.
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.
01.
<?xml version="1.0" encoding="UTF-16"?> 
02.
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
03.
  <RegistrationInfo> 
04.
    <Date>0000-00-00T00:00:00.0000000</Date> 
05.
    <Author>Host\System</Author> 
06.
  </RegistrationInfo> 
07.
  <Triggers> 
08.
    <TimeTrigger> 
09.
      <StartBoundary>0000-00-00T00:00:00</StartBoundary> 
10.
      <EndBoundary>0000-00-00T00:00:00</EndBoundary> 
11.
      <Enabled>true</Enabled> 
12.
    </TimeTrigger> 
13.
  </Triggers> 
14.
  <Principals> 
15.
    <Principal id="Author"> 
16.
      <UserId>Host\User</UserId> 
17.
      <LogonType>S4U</LogonType> 
18.
      <RunLevel>HighestAvailable</RunLevel> 
19.
    </Principal> 
20.
  </Principals> 
21.
  <Settings> 
22.
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
23.
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> 
24.
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> 
25.
    <AllowHardTerminate>true</AllowHardTerminate> 
26.
    <StartWhenAvailable>true</StartWhenAvailable> 
27.
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
28.
    <IdleSettings> 
29.
      <StopOnIdleEnd>false</StopOnIdleEnd> 
30.
      <RestartOnIdle>false</RestartOnIdle> 
31.
    </IdleSettings> 
32.
    <AllowStartOnDemand>false</AllowStartOnDemand> 
33.
    <Enabled>true</Enabled> 
34.
    <Hidden>false</Hidden> 
35.
    <RunOnlyIfIdle>false</RunOnlyIfIdle> 
36.
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession> 
37.
    <UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine> 
38.
    <WakeToRun>false</WakeToRun> 
39.
    <ExecutionTimeLimit>PT1H</ExecutionTimeLimit> 
40.
    <DeleteExpiredTaskAfter>PT0S</DeleteExpiredTaskAfter> 
41.
    <Priority>7</Priority> 
42.
    <RestartOnFailure> 
43.
      <Interval>PT1M</Interval> 
44.
      <Count>3</Count> 
45.
    </RestartOnFailure> 
46.
  </Settings> 
47.
  <Actions Context="Author"> 
48.
    <Exec> 
49.
      <Command>cmd</Command> 
50.
      <Arguments>/c "move "AAA.BBB" "CCC.DDD""</Arguments> 
51.
    </Exec> 
52.
  </Actions> 
53.
</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 .


Gruß
Friemler
Bitte warten ..
Mitglied: Bruendl
01.08.2011 um 09:40 Uhr
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
Bitte warten ..
Mitglied: Bruendl
01.08.2011 um 11:40 Uhr
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
Bitte warten ..
Mitglied: Friemler
01.08.2011 um 12:47 Uhr
Hallo Bründl,

OK, hier die Super-Einfach-Lösung, aber in VBScript. Das ist mir in Batchscript zu umständlich
01.
scMonitoredFolder = "E:\Test" 
02.
scDestFolder      = "E:\Ziel" 
03.
 
04.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
05.
 
06.
Set objRegExp        = New RegExp 
07.
objRegExp.Global     = False 
08.
objRegExp.IgnoreCase = True 
09.
objRegExp.Pattern    = "([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}).*\..*" 
10.
 
11.
intYearNow  = Year(Now) 
12.
intMonthNow = Month(Now) 
13.
intDayNow   = Day(Now) 
14.
 
15.
For Each objFile In objFSO.GetFolder(scMonitoredFolder).Files 
16.
  Set colMatches = objRegExp.Execute(objFile.Name) 
17.
 
18.
  If colMatches.Count > 0 Then 
19.
    intYearFile  = CInt(colMatches(0).SubMatches(0)) 
20.
    intMonthFile = CInt(colMatches(0).SubMatches(1)) 
21.
    intDayFile   = CInt(colMatches(0).SubMatches(2)) 
22.
 
23.
    If (intYearFile = intYearNow) And (intMonthFile = intMonthNow) And (intDayFile = intDayNow) Then 
24.
      objFile.Move(objFSO.BuildPath(scDestFolder, objFile.Name)) 
25.
    End If 
26.
  End If 
27.
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
Bitte warten ..
Mitglied: Bruendl
01.08.2011 um 13:08 Uhr
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 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
Bitte warten ..
Mitglied: Friemler
01.08.2011 um 13:25 Uhr
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
Bitte warten ..
Mitglied: Bruendl
01.08.2011 um 14:47 Uhr
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
Bitte warten ..
Mitglied: Bruendl
01.08.2011 um 15:44 Uhr
Der Diashow PC funktioniert einwandfrei 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
Bitte warten ..
Mitglied: Friemler
01.08.2011 um 15:48 Uhr
Hallo Bründl,

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

Gruß
Friemler
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Windows 10
Desktophintergrund via GPO Diashow Problem (3)

Frage von maddig zum Thema Windows 10 ...

Outlook & Mail
gelöst Office 365 - SMTP - automatisierte Mail versenden - "Gerät freigeben?!" (4)

Frage von KMUlife zum Thema Outlook & Mail ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...