http://dieseyer.de • all rights reserved • © 2003 v2.C



CD-Startmenü

Sobald einige PC-Kenntnisse vorhanden sind, wird man irgendwann um Hilfe, privat oder geschäftlich, gebeten. Um häufig benötigte Daten und Programme immer schnell zur Verfügung zu haben, bietet sich das Erstellen einer entsprechenden, eigenen Service-CD an. Natürlich wäre es noch schöner, wenn nach dem Einlegen der CD ein Menü startet; ein solches soll im folgenden erklärt werden.

In diesem Beispiel-Menü enthält die CD die Servicepacks für WinNT und Win2k, den Acrobat Reader, die Virenscanner F-Prot und McAfee, den MS InternetExplorer v6, die ServicePacks für MS Office 2k, den Total Commander (ehem. Windows Commander) und einige zu kopierende Tools. Ein Teil der Programme muss vor dem Ausführen kopiert werden und / oder es muss eine Versionsabfrage erfolgen. Um die Entwicklung und den Test des Skripts übersichtlicher zu gestalten, ist ein Test-Modus enthalten und die Anzeige einer Info- bzw. Hilfe-Datei ist möglich.


Teile des Skripts im Detail

cd-menu.vbs - das komplette Skript (ohne Zeilennummern) zum Download
cd-menu.html - der QuellCode.
cd-menu.txt - das komplette Skript mit Zeilennummern. (Um die Erklärung der Skriptzeilen übersichtlicher zu gestalten, sind Zeilennummern eingefügt, die im Skript nicht eingegeben werden dürfen.)

Im ersten Schritt wird in der Zeile 34 die Sub-Prozedur CDTest aufgerufen, die ab Zeile 501 einige Variable für die Programmaufrufe und Kopieroperationen ermittelt.

In den Zeilen 505 bis 533 wird an Hand von Registery-Einträgen das Betriebssystem festgestellt. Da die Registery-Schlüssel je nach Betriebssystem andere sind, verhindert   On Error Resume Next   bei nicht gefundenem Schlüssel nicht nur eine Fehlermeldung, sondern auch den Abbruch des gesamten Skripts.   On Error GoTo 0   stellt im Anschluß die normale Fehlerbehandlung wieder her. Wichtig ist die in Zeile 535 endgültig zusammengesetzte Variable   ZielSys.   Sie wird bei Standardinstallationen für Win9x/ME   c:\windows\command   und für WinNT/2k   c:\winnt\system32   enthalten. Später werden in diesem Verzeichnis Verknüpfungen abgelegt, die dann über <Start> <Ausführen> oder <Win-R> schnell aufrufbar sind.

Die Zeilen 586 bis 596 legen   InstDir   fest. Da Daten im Temp-Verzeichnis nicht dauerhaft gespeichert werden, wird ein anderes Verzeichnis gesucht: ein C:\Treiber-Verzeichnis z.B. ist sicher besser geeignet.

Die Do...Loop - Schleife über die Zeilen 86 bis 208 erstellt das Hauptmenü, zeigt es an und wertet die Eingaben aus. Zu Anfang fügen die Zeilen bis 107 die Zeichenkette mit den Menüpunkten zusammen, die in Zeile 109 mit der InputBox-Funktion angezeigt wird. Ab hier erfolgt eine Auswertung der Eingabe.

UCase()   erzeugt aus der Eingabezeichenfolge Großbuchstaben und verringert die Anzahl der notwendigen Vergleiche. Ist ein Vergleich der Eingabe richtig, wird zunächst überprüft, ob die CD auch die erforderlichen Dateien enthält. Ein Großteil der Programme startet dann einfach mit   WSHShell.Run (TextX),,TRUE.   Das   TRUE   stellt sicher, dass das Menü erst wieder erscheint, wenn das Programm beendet bzw. die Anwendung geschlossen ist.

Einige, vor allem DOS-Programme, lassen sich nicht immer so einfach starten. Dafür erstellt die Sub-Prozedur   ExeRun   (Zeile 446) eine Verknüpfung mit der CreateShortcut-Methode, nachdem eventuell bereits vorhandene Links gelöscht wurden.

Weitere Ausnahmen bilden Menü-Punkte, die eine Kopieroperation voraussetzen:

  143    If UCase(Eingabe) = "F"  Then  FProtCopy
  169    If UCase(Eingabe) = "MC" Then  McAfeeCopy
  170    If UCase(Eingabe) = "MI" Then  McAfeeCopy
  195    If UCase(Eingabe) = "V"  Then  VCcopy
  203    If UCase(Eingabe) = "WC" Then  WinCMDcopy
  204    If UCase(Eingabe) = "WI" Then  WinCMDcopy
Für die Auswahl von MC und WC erscheinen keine Menüpunkte und setzen sozusagen 'Insider-Wissen' voraus. Es werden Programme auf einen PC kopiert, für die eigentlich Lizenzen erforderlich sind. Da ich immer wieder 'wi' (für WinCMD installieren) statt 'wc' eingebe, habe ich die Zeilen mit der Abfrage nach 'MI' und 'WI' zusätzlich eingefügt.

Die Prozeduren   WinCMDcopy,   McAfeeCopy   und   FProtCopy   gleichen sich weitestgehend, so das die Beschreibung der   FProtCopy   - Prozedur reichen sollte.

In Zeile 404 wird geprüft, ob das erforderliche (Quell-) Verzeichnis vorhanden ist - falls nicht, wird die Prozedur mit   Exit Sub   verlassen.

Die For .. Next - Schleife (Zeilen 411 bis 417) ermittelt den Namen jeder Datei im Quell-Verzeichnis und versucht eine Datei gleichen Namens im Zielverzeichnis zu löschen. Um Fehlermeldungen bzw. den Skriptabbruch zu verhindern, wird die Fehlerbehandlung mit   On Error Resume Next   bis   On Error GoTo 0   ausgesetzt.

Jetzt wird das Quell- ins Zielverzeichnis kopiert (Zeile 423). Im Test-Modus wird vorher durch Zeile 422 angezeigt, was als nächstes wohin kopiert wird.

Im folgenden werden zwei Verknüpfungen in   c:\windows\command   (für Win9x/ME) oder in   c:\winnt\system32   für WinNT/2k angelegt. Dadurch ist es möglich, durch das gleichzeitige Drücken der <Windows>- und der <r>-Taste (also <Win-R>) und der Eingabe der Zeichenfolge   fp   oder   f-prot   den Virenscanner F-Prot zu starten.

Nach der Meldung, dass und wohin F-Prot kopiert wurde (Zeile 441) wird der Virenscanner auch gleich gestartet (Zeile 443). Diesmal wird die   WSHShell.Run   -Zeile nicht mit   , , True   abgeschlossen, damit das CD-Menü wieder angezeigt wird und gleichzeitig der Virenscanner läuft.


Autostart   &   autorun.inf

Will man die Autostartfunktion beim Einlegen einer CD nutzen, müssen noch einige Voraussetzungen erfüllt werden, da Windows nur EXE-Dateien ausführt. Dazu verwende ich die   ShelExec.exe   (Shelexec.exe ist in Shelexec.zip von naughter.com enthalten.) Steht folgendes in der   autorun.inf  
[autorun]
open=ShelExec.exe CDstart.VBS
übergibt die   ShelExec.exe   das Skript   CDstart.VBS   an Windows. Da Windows die Dateiendung .VBS kennt, startet Windows das Skript, wenn Windows das Skript findet.


Änderungen Das Skript ist im Mai 2002 entstanden - heute (Dez. 2002) würde ich einiges anders machen:
  109 Eingabe = InputBox(Anzeige,Titel,,500,1)
würde ich durch folgende ergänzen:
  110 Eingabe = UCase(Eingabe)
Damit vereinfacht sich dann in den Folgezeilen das   if UCase(Eingabe) . . .   und kann durch   if Eingabe . . .   ersetzt werden.

Um den Namen des anzulegenden Links zu ermitteln ging ich früher so vor:
  458 LNK = Mid(TextX, (InstrRev(TextX, "\")+1))
  459 LNK = Left( LNK, (Instr(LNK, ".")-1))
Heute ermittle ich den Namen einer Datei ohne Erweiterung so:
  458
  459 LNK = fso.GetBaseName( LNK )



http://dieseyer.de • all rights reserved • © 2003 v2.C