Verschiedene kleine VB-Skripte

Digicam-Kopier-Skript

Für meine Computertechnisch nicht so erfahrene Familie habe ich ein kleines WSH-Skript gebastelt, welches automatisch in allen Laufwerken nach einer Digicam (konkret nach einem Laufwerk mit Unterverzeichnis \DCIM) sucht und alle Dateien in den verschiedenen Unterverzeichnissen von \DCIM in einen Ordner (z.B.) C:\Digicam\0510 Neuer Ordner kopiert. Der Ordnername kann eingegeben werden in einer Eingabemaske:


 
Abb. 1: Eingabemaske

Daneben können auch Jahr und Monat geändert werden... Während dem Verschieben der Dateien von der Digicam auf die Harddisk werden die Bilddateien angezeigt und am Schluss des Kopiervorgangs wird ein Explorer-Fenster des Bildverzeichnisses geöffnet und die Anzahl kopierter Dateien ausgegeben.

Keine Wahnsinnsentwicklung, aber durchaus praktisch! Zudem zeigt sie, wie man mit Visual Basic Dialoge erstellen und in VB-Script einbinden kann! Die benötigte Ocx-Datei kann zum Beispiel mit der CCE (Control-Creation-Edition) von Visual-Basic 5.0 erstellt werden, diese eingeschränkte Version, welche keine Exe-Dateien, aber Ocx-Dateien ausgibt, kann von der Microsoft-Homepage heruntergeladen werden.

Installation

  1. Download von Digicam_Kopieren.zip (20 kB)
  2. Entzippen in einen Ordner
  3. Auf der Kommandozeile mit "regsvr32 DigicamKopieren.ocx" die benötigte Ocx-Datei registrieren.
  4. Mit "WScript DigicamKopieren.vbs" oder durch Doppelklicken auf DigicamKopieren.vbs im Explorer wird das Skript gestartet. Natürlich kann auch eine Verknüpfung zum Skript erstellt werden.


Digicam-Synchronisierungs-Skript


Da ich leider an meinem etwas altersschwachen Laptop nur einen USB1.1-Anschluss habe, ist die Datentransfer-Rate zu meiner externen Harddisk nicht gerade berauschend. Um trotzdem regelmässig sicherungskopien meiner Digicam-Bilder zu machen, habe ich ein kleines Skript geschrieben, welches die Ordnerstruktur in "C:\Digicam" und "G:\Digicam Sichern" vergleicht und nicht übereinstimmende Ordner gelöscht, resp. Hinüberkopiert. Das Skript führt dabei NUR Änderungen an der externen Harddisk und nicht an der Laptop-Disk durch. Vor jedem Kopier-/Löschvorgang erscheint eine Abfrage, ob dies wirklich gewünscht ist.

Wenn die Ordnerstruktur übereinstimmt, vergleicht das Skript die Anzahl Dateien in den Ordnern und Fragt bei unterschiedlicher Anzahl, ob der Ordner auf der externen Harddisk ersetzt werden soll.

Die Sache ist allerdings nicht sehr klever gelöst, so wird wenn ein Ordner auf der Laptop-Harddisk umbenannt wird, vom Skript der Ordner auf der exteren Harddisk zuerst gelöscht um dann wieder vom Laptop kopiert zu werden.

Da jeder Vorgang mittels WScript.Echo ausgegeben wird, sollte das Skript von der Kommandozeile aus gestartet werden, da sonst eine Message-Box-Flut der Bildschirm überdeckt ;-)

synchr_digicam.vbs (3 kB)


Menu-Änderung der Homepage


Da ich keine Ahnung von Php / CGI habe (und auch wenig Lust verspüre, mich hineinzuarbeiten), habe ich meine Homepage in reinem HTML aufgebaut. Dies hat den grossen Nachteil, dass jede einzelne Seite editiert werden muss, wenn die Menustruktur verändert wird. Mit dem Menu.vbs-Skript kann dies etwas Beschleunigt werden:

In der HTML-Datei wird vor und nach dem Menu ein Kommtar-Tag eingefügt:

<!-- Menu -->
<div class="menu1"><a href="index.html">Willkommen!</a></div>
<div class="menu2"><a href="home_ich.html">Ich</a></div>
....
<!-- Menu -->

Das Skript lies nun die Datei Menu.txt (1 kB) mit dem veränderten Menu ein und ersetzt in allen HTML-Dateien eines Ordners den Bereich zwischen den beiden Kommentaren. 

Ein Schnell-Hack... scheint aber zu funktionieren ;-) Dieses Skript lädt zum Abändern ein... in dieser Form wird kaum jemand es gebrauchen können!

Menu.vbs (1 kB)


Snippets...


sind kleine, aber oft verwendete Brocken VBScript, die in der hier präsentierten Form nicht lebensfähig sind, aber eine gute Grundlage für weitere Entwicklungen darstellen. (Siehe auch die auf der www.microsoft.com erhältliche Dokumentation zum Windows-Script-Host)

Da ich vergesslich bin, verwende ich in meinen Skripten immer die explizite Deklaration von Variablen. Die Variabeln müssen somit deklariert werden, dafür werden Druckfehler schneller erkannt!


Dateien Schreiben/Lesen

Const ForReading = 1
Const ForWriting = 2

Set MyFSO = CreateObject("Scripting.FileSystemObject")

Set Datei=MyFSO.OpenTextFile("Eingabe.txt", ForReading)
Zeile=Datei.ReadLine()
Alles=Datei.ReadAll()

Set Datei=MyFSO.OpenTextFile("Ausgabe.txt", ForWriting,True) '3. Arg.=True erstellt eine neue Datei
Datei.Write(DateiNeu)
Datei.Close


Rekursiv von einem Ordner ausgehend alle Dateien bearbeiten

Option Explicit

Dim MyFSO
Set MyFSO = CreateObject("Scripting.FileSystemObject")
ScanDir("C:\Digicam")


Sub ScanDir(ScanPfad)
    Dim PathObject, FileObject, FileNow, SubFolders, SubFoldersNow
   
    Set PathObject=MyFSO.getFolder(ScanPfad)
    Set FileObject=PathObject.Files   

    For Each FileNow In FileObject
        DoFile(FileNow)
    Next
   
    Set SubFolders=PathObject.SubFolders
    For Each SubFoldersNow in SubFolders
        ScanDir(SubFoldersNow.ParentFolder+"\"+ SubFoldersNow.Name)
    Next
End Sub

Sub DoFile(Datei)
    WScript.ECHO Datei.Name&" "&Datei.DateLastModified&" "&Datei.Path
End Sub


Bild mit dem Internet-Explorer Speichern

Set IE = CreateObject("InternetExplorer.Application")
Set WshShell = WScript.CreateObject("WScript.Shell")

IE.Visible = 1

IE.Navigate "http://www02.wdr.de/webcam/cam1.jpg"
           
Do While IE.busy
Loop
     
If Not Left(IE.Document.title,8)="HTTP 404" Then
    WshShell.SendKeys "%D"  ' Alt-D "Datei"
    WshShell.SendKeys "u"   ' u "Speichern unter"
    WshShell.SendKeys "C:\test.jpg" 'Pfad eingeben
    WshShell.SendKeys "~" ' Enter
    Do While IE.busy
    Loop
End If    


Exif-Informationen auslesen

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace("C:\Dokumente und Einstellungen\Simon Bruderer\Eigene Dateien\wsh\exif auslesen")
Set objFolderItem = objFolder.ParseName("P2210002.JPG")

if (not objFolderItem Is Nothing) then
    for i=0 to 30
            WScript.Echo CStr(i)+" "+objFolder.GetDetailsOf(objFolderItem, i)
    next
end if   


Mailen mittels CDO

Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Subject"
objMessage.Sender = "ich@bluewin.ch"
objMessage.To = "fritzli@test.ch"
objMessage.TextBody = "Text"

objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "test.mail.ch"
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "ich"
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "31415926"
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
objMessage.Configuration.Fields.Update

objMessage.Send


(siehe auch www.paulsadowski.com/WSH/cdo.htm)

Einzeiler ohne Kommentar

Set FSO = CreateObject("Scripting.FileSystemObject")

FSO.MoveFile "C:\Ordner_A\Datei.txt", "D:\Ordner_B\Datei.txt"
FSO.CopyFile "C:\Ordner_A\Datei.txt", "D:\Ordner_B\Datei.txt"
If FSO.FileExists("c:\Autoexec.bat") Then WScript.Echo "C:\... existiert" 

WScript.Echo "Zeile 1"+Chr(10)+"Zeile 2"
WScript.sleep(1000)
WScript.Quit 1 


[... zu Ergänzen ...]