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
open=ShelExec.exe CDstart.VBS
Ä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 )