Tips zum Windows Scripting HostDer Windows Scripting Host (WSH) ist eine abgespeckte Variante von Visual Basic. Er ist mächtiger als die guten alten DOS-Batchdateien, aber dementsprechend leider auch weniger leicht zu erlernen.Nachfolgend einige Module, die ich in unterschiedlichen Scripten immer wieder für die Dateiverwaltung und zur bequemeren Bedienung von Programmen einsetze. Alle Beispiele sind vollständige Scripte, damit diese mit Copy&Paste schnell übertragen und als Scriptdatei (*.vbs) getestet werden können. In einigen Fällen sind evtl. die Pfade anzupassen. Anwendungen startenset ws = wscript.createobject("wscript.shell")ws.Run "Notepad.exe" Auch Parameter können verwendet werden: set ws = wscript.createobject("wscript.shell") ws.Run "Notepad.exe " + "1.txt", 2, vbtrue Der Parameter vbtrue bewirkt, dass das Script mit der weiteren Ausführung wartet, bis die gestartete Anwendung wieder geschlossen wurde. Wichtig: Das Leerzeichen zwischen Programmbefehl und dem abschließenden Anführunxzeichen. Dies ist immer dann erforderlich, wenn mit dem Programmbefehl ein Befehlszeilenparameter, im oberen Beispiel also 1.txt, verknüpft wird. Grund: Ohne Leerzeichen kann der WSH die Grenze zwischen Programm und Parametern nicht erkennen und steigt aus. Aus demselben Grund wird ein Leerzeichen auch bei der Verwendung von Parametern unmittelbar hinter dem Programmbefehl, im nachfolgenden Beispiel also vor dem Parameter /n benötigt: set ws = wscript.createobject("wscript.shell") ws.Run "explorer.exe /n", 1 Die Zahlen bedeuten: 0 Fenster ist vollkommen unsichtbar. 1 Normale Fenstergröße 2 Minimiertes Fenster (erscheint in der Taskleiste, ist ausgewählt) 3 Maximiertes Fenster (bildschirmfüllend) 4 Fenster wird geöffnet, aber vorher aktives Fenster bleibt aktiv 5 Fenster wird in derselben Größe geöffnet wie beim letzten Mal 6 Minimiertes Fenster. Nächste Fenster in der Reihenfolge wird aktiv 7 Minimiertes Fenster. Das vorher aktive Fenster bleibt aktiv 8 Fenster wird in derselben Größe geöffnet wie beim letzten Mal. Vorher aktives Fenster bleibt aktiv 9 Fenster erscheint in normaler Größe Datei als überarbeitete Kopie speichernDie Datei 103.txt wird geöffnet und zeilenweise ausgelesen. Wenn eine Zeile aus dem Begriff "Duhden" besteht, wird dieser durch "Duden" ersetzt. Alle Zeilen werden in die neu angelegte Datei 103neu.txt eingelesen. Dadurch erhalten wir eine überarbeitete Kopie der Ausganxdatei. Achtung: Falls eine Datei 103neu.txt bereits existiert, wird sie ohne Rückfrage überschrieben.Set fs= CreateObject("scripting.filesystemobject") set LeseDatei = fs.opentextfile("C:\Prox\103.txt") set SchreibeDatei = fs.opentextfile("C:\Prox\103neu.txt", 2, true) Do Until LeseDatei.AtEndOfStream Zeile = LeseDatei.ReadLine if zeile = "Duhden" then zeile = "Duden" end if SchreibeDatei.WriteLine(Zeile) Loop LeseDatei.Close SchreibeDatei.Close DOS Befehle ausführenManchmal ist es erheblich einfacher, schnell einen DOS-Befehl in eine Scriptdatei einzufügen, anstatt die entsprechende Funktion mühsam Visual Basic-konform zu programmieren. Durch die DOS-Befehle poppt normalerweise eine Eingabeaufforderung auf. Diese kann man allerdinx unterdrücken, so dass nichts beim Scriptablauf störend wirkt.Nachfolgendes Beispiel zeigt den Inhalt von C:\ und läuft daher sichtbar ab: Set ws = CreateObject("WScript.Shell") ws.Run "%COMSPEC% /K DIR C:\",1 %COMSPEC% ist je nach Betriebssystem die Umbebunxvariable für command.com oder cmd.exe. %COMSPEC% /K bedeutet: Eingabeaufforderung bleibt geöffnet. %COMSPEC% /C bedeutet: Schließen der Eingabeaufforderung nach Ausführung des Befehls. Das nachfolgende Beispiel läuft unsichtbar ab und löscht unter Windoof 9x den Inhalt eines Ordners ohne Rückfrage: Set ws = CreateObject("WScript.Shell") ws.Run "%COMSPEC% /C DELTREE /Y C:\Test\*.*",0 Tip: Gerade beim unsichtbaren Ablauf sollte man das automatische Schließen der Eingabeaufforderung nach Ausführung nicht vergessen, da diese sonst im Hintergrund offen bleibt. Netzlaufwerke verbinden und trennenDas nachfolgende Script läuft unsichtbar ab. Es verbindet beispielhaft 3 Netzlaufwerke, davon die ersten beiden dauerhaft und das dritte nur für die aktuelle Sitzung. Im zweiten Beispiel kommt am Ende des Pfades der Ordner "Archiv 103" vor. Da ein Leerzeichen im Pfad Probleme beim Verbinden des Netzlaufwerks verursachen kann, wird hier die DOS-konforme Schreibweise "ARCHIV~1" verwendet.Set ws = Wscript.CreateObject("Wscript.Shell") ws.Run "net use G: \\siesr20103\gruppen\sie\abc$ /PERSISTENT:YES", 0, vbtrue ws.Run "net use H: \\siesr20206\gruppen\ARCHIV~1 /PERSISTENT:YES", 0, vbtrue ws.Run "net use X: \\server103008\siefahrer.02$ /PERSISTENT:NO", 0 Hier werden die Netzlaufwerke wieder getrennt: Set ws = Wscript.CreateObject("Wscript.Shell") ws.Run "net use G: /delete", 0 ws.Run "net use H: /delete", 0 ws.Run "net use X: /delete", 0 Opera Favicons löschenBeim Surfen speichert Opera automatisch von jeder Webseite ein evtl. vorhandenes Favicon im Ordner \profile\images im Opera-Programmordner ab. Auf diese Weise können sich im Lauf der Zeit Tausende von Icon-Dateien ansammeln. Natürlich kann man den Ordner ab und zu manuell leeren, doch dann sind auch die Favicons der abgespeicherten Lesezeichen erst mal weg.Das Script schafft hier Abhilfe: Es löscht nur diejenigen Favicons, die nicht als Lesezeichen vorliegen. Datzu vergleicht es die Icons in \profile\images mit den Einträgen in der Bookmarkdatei (opera6.adr). Icons, die nicht als Bookmarks vorliegen, werden gelöscht. Set fs= CreateObject("scripting.filesystemobject") Set ws = CreateObject("WScript.Shell") Set LesezeichenDatei = fs.opentextfile("K:\Prox\OperaUSB\profile\opera6.adr", 1, true) Set IconOrdner = fs.GetFolder("K:\Prox\OperaUSB\profile\images") ' Einlesen der Lesezeichendatei in einen String Inhalt = LesezeichenDatei.ReadAll LesezeichenDatei.close ' Alle Dateien des Ordners \images einlesen u. prüfen, ob sie in Lesezeichendatei vorkommen Geloeschte = 0 AnzIcons = 0 Set IconArray = IconOrdner.Files For Each Icon in IconArray AnzIcons = AnzIcons + 1 If Instr(1, Inhalt, Icon.name, 1) = 0 Then Icon.delete Geloeschte = Geloeschte + 1 End If Next MsgBox Geloeschte & " Icon(s) von " & AnzIcons & " gelöscht", 64, "Opera Favicons löschen" Registry von WinNT/2k/XP sichern mit ERUNTDas Script öffnet eine Inputbox, in die ein Name für einen Sicherungsordner eingegeben werden kann. Voreingestellt ist ein Ordnername, der aus dem Tagesdatum in der Form "2007-08-28" besteht. Dann startet es ERUNT.EXE, das den neuen Ordner im Pfad E:\103\Erunt\ anlegt und dort hinein die Dateien der Registry (System + aktuell angemeldete Benutzer) kopiert. Ist der Ordner bereits vorhanden, und sind evtl. bereits Dateien darin, werden diese ohne Rückfrage gelöscht. ERUNT lässt sich nur als Administrator einsetzen. Siehe auch unter Win-Tips.Set ws = CreateObject("WScript.Shell") Verz = "E:\103\Erunt\" Tagesdatum = Date ' Form: 28.08.2007 Feld = Split(Tagesdatum, ".") ' Datum in TT MM JJ auftrennen Datum= Feld(2)&"-"&Feld(1)&"-"&Feld(0) ' Form: 2007-08-28 Ordner = InputBox("Ordnername eingeben:", "Win2k Registry sichern", Verz & Datum) If Ordner = "" then wscript.quit ws.Run "K:\Prox\ERU_NT\ERUNT.EXE" & " " & Ordner & " sysreg curuser otherusers /noconfirmdelete" Runas-Befehl automatisiertMit diesem Script kann man ab Win2k ein Programm unter einem anderen Benutzerkonto als dem aktuellen starten, ohne eine Eingabe zu machen. Siehe auch unter Administraitor-Tips.' Registry-Editor als Administrator starten ' Clientname: SIE103 ' Benutzername: admin ' Kennwort: 103103-8 Set ws = CreateObject("WScript.Shell") Prog = "regedit.exe" ws.run "runas /user:SIE103\admin " + CHR(34) + Prog + CHR(34) wscript.sleep 1000 ws.Sendkeys "{1}{0}{3}{1}{0}{3}{-}{8}{ENTER}" Weitere Beispiele für die Variable "Prog": "cmd.exe" Eingabeaufforderung "mmc.exe compmgmt.msc" Computerverwaltung "rundll32 shell32.dll,Control_RunDLL Sysdm.cpl" Systemsteuerung "rundll32 shell32.dll,Control_RunDLL Appwiz.cpl" Systemsteuerung Software "regedit /s C:\Prox\TEST.REG" Registrierungsdatei einlesen "wscript D:\Temp\Tools\Hallo.vbs" VBScript starten Timer oder Erinnerungs-PopupNach Ablauf einer frei einstellbaren Wartezeit erscheint eine Meldung. Die voreingestellte Ruhezeit des Scripts je Warteschleife beträgt hier 30 Sekunden.set ws = wscript.createobject("wscript.shell") Minuten = InputBox("Verbleibende Minuten eingeben:", "Erinnerungspopup") Zeitpunkt = DateAdd("n", Minuten-1, Now) While Zeitpunkt > Now wscript.sleep 30000 Wend Msgbox "Zeit abgelaufen!" WarteschleifenZiel: Warten, bis ein Anwendungsfenster geladen ist - alle 200 Millisekunden checken. Wenn Anwendungsfenster da ist, wird es aktiv gesetzt und die Warteschleife verlassen. Immer wieder erforderlich, wenn Tastatureingaben erst dann an ein Anwendungsfenster geschickt werden sollen, wenn dieses auch geladen ist. Im Gegensatz zur Methode wscript.sleep wartet das Script auch dann, wenn das Fenster länger zum Laden braucht.1. Methode mit WHILE - WENDset ws = wscript.createobject("wscript.shell")ws.Run "C:\Programme\Internet Explorer 5\IEXPLORE.EXE" 'Warteschleife WHILE ws.AppActivate("Google - Microsoft Internet Explorer") = FALSE wscript.sleep 200 WEND 'Ende der Warteschleife 2. Methode mit DO - LOOPset ws = wscript.createobject("wscript.shell")ws.Run "C:\Programme\Internet Explorer 5\IEXPLORE.EXE" 'Warteschleife DO IF ws.AppActivate("Google - Microsoft Internet Explorer") = FALSE THEN wscript.sleep 200 ELSE EXIT DO END IF LOOP 'Ende der Warteschleife Anmerkungen: Die Methoden WHILE - WEND und DO - LOOP sind gleichwertig. wscript.sleep innerhalb der Warteschleife ist wichtig, damit das Script beim Schleifendrehen immer wieder pausiert und nicht sämtliche Systemressourcen beansprucht. Der Wert 200 ms ist ein Erfahrungswert und kann auch geändert werden; er sollte so hoch gewählt werden, dass das Script möglichst wenig Systemressourcen verbrät, aber so niedrig, dass nicht unnötig lange Pausen entstehen. Wenn die IF-Bedingung nicht erfüllt wird, eiert das Script unendlich lang im Hintergrund rum. Dies kann man verhindern, wenn man eine definierte Schleifenzahl (= Wartezeit) vorgibt. Optional kann eine Meldung erfolgen, wenn die Bedingung nicht erfüllt wurde. Das funzt folgendermaßen: 3. Methode mit FOR - NEXTset ws = wscript.createobject("wscript.shell")ws.Run "C:\PROGRA~1\INTERN~1\IEXPLORE.EXE" 'Warteschleife von 50 x 200 ms = 10 s FOR i = 1 to 50 IF ws.AppActivate("Google - Microsoft Internet Explorer") = FALSE THEN wscript.sleep 200 ELSE i = 50 END IF NEXT 'Ende der Warteschleife IF ws.AppActivate("Google - Microsoft Internet Explorer") = FALSE THEN msgbox "Google wurde nicht geöffnet" END IF Anmerkungen: ELSE i = 50 setzt den maximalen Schleifenwert, um bei zutreffender Bedingung die Schleife zu verlassen. |