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.




Impressum
Datenschutz