129. Explorerdialogfenster mit VBS oder HTAaufrufen und ermittelten Pfad
in Textdokument schreiben
Einleitung
Mit einem Dialogfenster in VBS oder HTA einen Ordnerpfad zu ermitteln
ist easy, aber
dadurch, dass es wegen Sicherheitsbestimmungen ab Internet Explorer 8
verboten ist, einen Pfad mit dem Öffnen-Dialog des Explorers
herauszufinden und zu speichern, gibt es wenig valide Beispiele im
Internet, wie diese Funktionsweise in eine HTA einzubauen ist. Das
folgende Konstrukt erzeugt keinen Fakepath, sondern den orignale Pfad
einschließlich des Dateinamens!
Der Sternenhimmelstuermer extrahierte also zwei Zeilen Code von http://social.technet.microsoft.com/Forums/en-GB/ITCG/thread/a3b358e8-15ae-4ba3-bca5-ec349df65ef6
und stellt Sie wie gewohnt Batchschreibern abgeändert zur
Verfügung.
Im eben genannten link ist ein wahnsinnig langer Code für VBS, der auch
funktioniert. Passt man dass hier vorgestellte Basisskript ein wenig
an, dann ist der Code ein wenig kleiner...
Der Quelltext ist ein wenig aufgebläht, damit eine rudimentäre HTA
erkennbar ist. Wichtig sind nur die roten Zeilen. Dennoch erklärt der
Sternenhimmelstuermer im Schnelldurchlauf die HTA: Ansonsten wieder den
folgendenen blauen Text mit grünen und roten Einschüben kopieren und in
Texteditor hineinkopieren. Dann in beliebigerAnwendungsname.hta
umbenennen und die hta mit Doppelklick öffnen...
Inhaltsangabe
Quelltext
Erklärung Schritt für Schritt
Für Batchschreiber: Batch mit HTA starten und auf Ausführung der Batch warten
Fazit
Quelltext
<html>
<head>
<title>Babel</title>
<HTA:APPLICATION
APPLICATIONNAME="Dateipfad"
VERSION = "0.1"
SCROLL="yes"
SINGLEINSTANCE="yes"
WINDOWSTATE="maximize"
>
<style type="text/css">
a {color:#FFFF33;
font-size:10pt; font-family:verdana,sans-serif,tahoma;
text-decoration:none}
a:hover {color:#FF0000;
font-size:10pt; font-family:verdana,sans-serif,tahoma;
text-decoration:none}
a.menu1 {color:#FFFFFF;
font-family:verdana,sans-serif,tahoma; font-size:8pt;
text-decoration:none}
a.menu1:hover {color:#FF0000;
font-family:verdana,sans-serif,tahoma; font-size:8pt;
text-decoration:none}
a.menu2 {color:#FFFFFF;
font-family:verdana,sans-serif,tahoma; font-size:9pt;
text-decoration:none}
a.menu2:hover {color:#FF0000;
font-family:verdana,sans-serif,tahoma; font-size:9pt;
text-decoration:none}
</style>
<hta:application applicationname="Open
File" border="dialog" borderstyle="normal"" caption="Open File"
contextmenu="no" maximizebutton="no" minimizebutton="no" navigable="no"
scroll="no" selection="no" showintaskbar="no" singleinstance="yes"
sysmenu="no" version="1.0" windowstate="minimize">
</head>
<SCRIPT
Language="VBScript">
Sub Runscript
Dim fso
Set fso =
CreateObject("Scripting.FileSystemObject")
if fso.FileExists("test.txt") then
Set objFSO =
CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.OpenTextFile("test.txt", 8, false)
objFile.WriteLine FileName.Value
objFile.Close
else
Set
objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CreateTextFile("test.txt")
Set
objFile = objFSO.OpenTextFile("test.txt", 2)
objFile.WriteLine FileName.Value
objFile.Close
end if
End Sub
</SCRIPT>
<center><body
style="color: white; background-color: black;" alink="red"
link="yellow" vlink="#3333ff">
<div><input Application="True" type="file"
id="FileName" /></div><br>
<div><input
id=runbutton class="button" type="button" value="Run Button"
name="run_button" onClick="RunScript"></div>
<center/>
</body>
</html>
Funktionsweise: Nach dem Doppelklick wird die HTA geöffnet. Sie drücken
dann den Button Durchsuchen und das Dialogfenster des Explorers öffnet
sich.
Da steht dann Datei zum Hochladen auswählen - Keine Sorge, da
wird nichts hochgeladen. Dann suchen Sie sich ein beliebiges Dokument,
Datei oder Exe aus. Wie gewohnt - da Sie nicht das erste mal eine Datei
öffnen,
bedarf das keiner weiteren Erklärung-:)
Sobald die Datei
ausgesucht und das Fenster geschlossen ist steht der komplette Dateipfad
einschließlich Dateiname im Inputfeld.
Sie kennen bestimmt von anderen Software-Anwendungen diese Hilfsfunktion.
Danach betätigen Sie den Run-Button.
Dieser erstellt ein Textdokument mit dem Namen Test.txt. Sie können
dann gerne einen anderen Dateipfad aufrufen, diesen sich wieder
anzeigen lassen und dann wieder den Run-Button betätigen. Dieser Pfad
wird dann in der nächsten Zeile des Test.txt geschrieben.
Ja, der Sternenhimmelstuermer zeigt hier auch, wie man sich ganze
Listen erstellen kann, die man auch gerne mit einer Batch
weiter bearbeiten kann. Es wäre z. B. auch möglich, eine Batch zu
erstellen, diese mit einem Batchtext zu füllen und so
indirekt die Datei zu starten...
Erklärung Schritt für Schritt
<html>
<head>
<title>Babel</title>
<HTA:APPLICATION
APPLICATIONNAME="Dateipfad"
VERSION = "0.1"
SCROLL="yes"
SINGLEINSTANCE="yes"
WINDOWSTATE="maximize"
>
Der erste Teil ist die Einleitung für die HTA im Headbereich bis zum
>
<style type="text/css">
a {color:#FFFF33;
font-size:10pt; font-family:verdana,sans-serif,tahoma;
text-decoration:none}
a:hover {color:#FF0000;
font-size:10pt; font-family:verdana,sans-serif,tahoma;
text-decoration:none}
a.menu1 {color:#FFFFFF;
font-family:verdana,sans-serif,tahoma; font-size:8pt;
text-decoration:none}
a.menu1:hover {color:#FF0000;
font-family:verdana,sans-serif,tahoma; font-size:8pt;
text-decoration:none}
a.menu2 {color:#FFFFFF;
font-family:verdana,sans-serif,tahoma; font-size:9pt;
text-decoration:none}
a.menu2:hover {color:#FF0000;
font-family:verdana,sans-serif,tahoma; font-size:9pt;
text-decoration:none}
</style>
Danach kommt css für die Formatierung - absolut nicht notwendig !
Jetzt wird es interessant: Kurz vor dem Ende des Headbereichs kommt der
wichtige Code
<hta:application applicationname="Open
File" border="dialog" borderstyle="normal"" caption="Open File"
contextmenu="no" maximizebutton="no" minimizebutton="no" navigable="no"
scroll="no" selection="no" showintaskbar="no" singleinstance="yes"
sysmenu="no" version="1.0" windowstate="minimize">
</head>
Das wird jetzt quasi eine kleine HTA Applikation in der HTA.
Hier wird quasi das Inputfeld kreiert. Wie es Ihnen
auffällt, steht nirgends Durchsuchen - was später beim deutschen
Windows die Inschrift des Suchen-Buttons ist.
Der Bezugspunkt zum Input-Feld im Body ist der Applikationsname.
<SCRIPT
Language="VBScript">
Sub Runscript
Dim fso
Set fso =
CreateObject("Scripting.FileSystemObject")
if fso.FileExists("test.txt") then
Set objFSO =
CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.OpenTextFile("test.txt", 8, false)
objFile.WriteLine FileName.Value
objFile.Close
else
Set
objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CreateTextFile("test.txt")
Set
objFile = objFSO.OpenTextFile("test.txt", 2)
objFile.WriteLine FileName.Value
objFile.Close
end if
End Sub
</SCRIPT>
Das Skript bezieht sich nicht auf die Ermittlung des Pfades, sondern auf die Verwertung des Pfades, der im
Inputfeld angezeigt wird. Das Inputfeld im Body der HTA hat eine
ID, nämlich FileName - dessen aktueller Inhalt
ist der Value - dieser wird in ein Textdokument geschrieben.
Sub Runscript - Runscript
ist der Anfang eines Skriptes, dass auf Betätigung des Run Buttons
ausgeführt wird: <input
id=runbutton class="button" type="button" value="Run Button"
name="run_button" onClick="RunScript">
Dim fso
Set fso =
CreateObject("Scripting.FileSystemObject")
Eine Variable wird erstellt und ein imaginäres Metadokument erzeugt.
if fso.FileExists("test.txt") then
Eine Prüfung wird eingeleitet, ob ein Test.txt Dokument vorliegt. Liegt
es vor, dann...
Set objFSO =
CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.OpenTextFile("test.txt", 8, false)
objFile.WriteLine FileName.Value
objFile.Close
wird ein weiterer Wert hinzugeschrieben. Die 8 steht für ergänzen und
FileName.Value ist der Pfad. An dieser stelle könnte man nach objFile.WriteLine beliebigen
Text hinzufügen - natürlich nur nach Syntax von VBS:
z. B. objFile.WriteLine "Der
Pfad ist " & FileName.Value
Der Sternenhimmelstuermer macht keinen Hehl draus: Bei schweren Texten
mit Sonderzeichen und Anführungszeichen wird das richtig kompliziert...
else
Set
objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CreateTextFile("test.txt")
Set
objFile = objFSO.OpenTextFile("test.txt", 2)
objFile.WriteLine FileName.Value
objFile.Close
Jetzt kam der andere Fall, dass noch kein Test.txt existiert. Fast
dasselbe, nur das hier eine 2 gesetzt wird - die für destruktives
überschreiben steht - es existierte zuvor kein Dokument, also nicht
gefährlich. Natürlich könnten Sie auch im ersten Fall eine 2 setzen,
dass müssen Sie entscheiden...
end if
End Sub
Das Ende der Prüfung und das Ende des Skriptes.... mit dem Endtag </SCRIPT>
<center><body
style="color: white; background-color: black;" alink="red"
link="yellow" vlink="#3333ff">
<div><input Application="True" type="file"
id="FileName" /></div><br>
<div><input
id=runbutton class="button" type="button" value="Run Button"
name="run_button" onClick="RunScript"></div>
<center/>
</body>
Das ist jetzt höchst unsauberes HTML, da die Center Anweisung zur
Zentrierung des Inhalts vor dem Body steht - der Internet Explorer ist
gutmütig...
<input Application="True" type="file" id="FileName" />
beinhaltet jetzt das Input-Feld in dem der Pfad steht und der
Durchsuchen-Button wird automatisch rechts neben dem Feld angezeigt.
<input
id=runbutton class="button" type="button" value="Run Button"
name="run_button" onClick="RunScript">
Das zweite Buttonfeld startet das oben ausführliche geschilderte
Exportieren des Pfades nach Auswahl und Betätigen des
Run-Buttons - gar nicht so kompliziert...
Für Batchschreiber: Batch mit HTA starten und auf Ausführung der Batch warten
dim shell
set shell = createobject("wscript.shell")
shell.run """irgendeine.bat""", 1, true
Der Sternenhimmelstuermer schreibt ja überwiegend für Batchschreiber, deshalb hier noch einmal erwähnt, wie man ein start /wait aus der Batchwelt in der HTA simuliert.
Es bietet sich bei fast allen Chimären aus Batch und HTA an, mit der HTA zu starten - ist halt das Grafik User Interface (GUI).
Danach wechselt man zur Batch. Dabei kann es nicht verkehrt sein, sich
eine Option offen zu halten wieder zur HTA zurückzukehren.
Die drei o. a. Zeilen definieren wieder ein Objekt, dass sich shell nennt. In diesem Objekt wird eine irgendeine.bat gestartet und der Parameter 1 und true wartet auf die Ausführung der Batch.
Dahinter können dann beliebige andere beliebige andere Befehle stehen,
die erst nach Ausführung der Batch gestartet werden.
Der Sternenhimmelstuermer stellt bei seinen Ausflügen im Internet immer wieder wieder fest, dass in der Batchwelt start /wait und VBS-Welt shell.run...,1, true ignoriert werden, mit der Folge, dass unsinnige Beep, timeout
oder sonstige Schleifenkonstruktionen erzeugt werden, um auf die
Ausführung einer Batch oder umgekehrt einer VBS zu warten: Freilich
findet man mit diesen Konstruktionen den richtigen Zeitpunkt des
Beendens eines Skriptes nie!
Für das Ausführen einer anderen Datei und dem Warten auf das Ergebnis ist dieses der einzige adäquate Weg! Egal ob einige Milisekunden, Minuten oder Stunden, dass Skript geht in Lauerstellung!
Fazit
Für den Sternenhimmelstuermer war dieses eine Zwischenabhandlung für
ein kryptologisches Programm, für Sie vielleicht die Antwort auf die
Frage, wie man sich das Explorerfenster zur Ermittlung eines Pfades
nutzen kann.
Das wichtige ist, sich genügend Codeschnipsel aufzubauen, damit später
Vorlagen bereit liegen. Die Hauptanwenung kostet dann nur noch an sich
wenige Stunden Arbeit.
Haftungsausschluss - Das verwenden von Tipps oder Software auf dieser Seite auf eigene Gefahr.