2016-04-22 10 views
2

Ich führe gerade ein neues VBscript von meinem Hauptvbscript aus, indem ich das zweite Skript 'on the fly' aus einem Array von Strings schreibe und es in eine externe secondfile.vbs Datei schreibe, dann brauche ich WshShell.Run "C:\secondfile.vbs" es läuft weiter, während auch der erste läuft.Vbscript von einem anderen Skript ausführen, ohne eine Datei zu schreiben

Das Problem, das ich habe, ist, da ich es oft wiederholen muss, das Schreiben der neuen Vbs-Datei mit FSO verlangsamt den Prozess ein wenig - ich versuche, das zu beseitigen. Gibt es eine Möglichkeit, ein VBScript aus dem Speicher auszuführen, ohne eine physische Datei zu erstellen? Auf der Suche nach einer Möglichkeit, mein Skript als Zeichenfolgen zu erhalten und direkt als unabhängiges vbscript auszuführen. Vielen Dank im Voraus für Anregungen.

Hier ist ein vereinfachte Code, wie es funktioniert zur Zeit:

Option Explicit 

'this is the main RhinoScript file 
Call MainRhinoScript() 
Sub MainRhinoScript() 

    'create Wscript.Shell object 
    Dim WshShell : Set WshShell = CreateObject("WScript.Shell") 
    Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject"): 
    'get or create user settings plugin folder and vbs file path string 
    Dim strVBSEventWatcherFile : strVBSEventWatcherFile = "C:\eventwatcher.vbs" 

    Do 
     'create auto-generated vbs file here and run it 
     Call WriteVBS_EventWatcher_File(strVBSEventWatcherFile, 
     Call WshShell.Run(strVBSEventWatcherFile) 

     'The main code goes here, looped until done. 
     'VBS eventwatcher script file is running simultaneously. 
    Loop 

End Sub 

'this is simplified VBS writing subroutine to demonstrate how the code works, the actual one is much longer: 
Private Sub WriteVBS_EventWatcher_File(strFilePath) 

    Dim i,fso : Set fso = CreateObject("Scripting.FileSystemObject") 
    Dim file : Set file = fso.CreateTextFile(strFilePath, True) 

    file.WriteLine("Option Explicit") 
    file.WriteLine("") 
    file.WriteLine("Call Main()") 
    file.WriteLine("Sub Main()") 
    file.WriteLine(" Dim WshShell : Set WshShell = CreateObject(""WScript.Shell"")'create shell script object") 
    file.WriteLine("WScript.Sleep 10") 
    file.WriteLine("WshShell.SendKeys ""Rhino_Preselect "" ") 
    file.WriteLine("End Sub") 
    file.Close() 

End Sub 
+0

Sieht aus wie ein [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) für mich. Beschreiben Sie das eigentliche Problem, das Sie lösen möchten. – MikeC

+0

Hi @MikeC, Sie können den ersten Teil ignorieren, wenn Sie den Kontext nicht kennen müssen. Die einfache Frage lautet: "Gibt es eine Möglichkeit, ein VBScript im Speicher zu erstellen und es auszuführen, ohne eine VBS-Datei auf HD zu erstellen?" – Jarek

+0

Die Situation ist das genaue Gegenteil. Lesen Sie den Link zum "XY-Problem". Ich möchte wissen, was Sie eigentlich erreichen wollen. – MikeC

Antwort

2

Der einfachste Weg, einen Code withing läuft WSH VB-Skript zu übergeben, den Code zu ExecuteGlobal Funktion (oder Execute mit lokalem Bereich) auszuführen:

arrCode = Array(_ 
    "For x = 1 To 10", _ 
    "MsgBox x", _ 
    "Next"_ 
    ) 

strCode = Join(arrCode, vbCrLf) 

ExecuteGlobal strCode 

können Sie finden VBScript "Multi-Prozess" Implementierung by the link. Der Code funktioniert nur für die WSH-Skript-Engine. In der RhinoScript-Umgebung muss dieser Code überarbeitet und angepasst werden, da folgende Unterschiede bestehen: RhinoScript verfügt über kein WScript-Objekt, daher kann der Pfad zur gestarteten RhinoScript-Datei nicht abgerufen werden. Die einzige Möglichkeit besteht darin, den Pfad im Code fest zu codieren. Auch WSH VBS-Dateierweiterung ist .vbs, und für RhinoScript ist es .rvb.

Einige Sachen sind aus den Kommentaren klarer geworden. Sie haben geschrieben, dass Sie versuchen, den Code schneller auszuführen, aber beachten Sie, dass die Methode WshShell.SendKeys viel länger dauert als das Speichern und Ausführen der Datei, und sie ist unzuverlässig. Mein Hinweis ist zu vermeiden, .SendKeys zu verwenden und zu versuchen, Automatisierung unter Verwendung RhinoScript object model Anwendung Methoden zu implementieren. Vielleicht brauchen Sie keine Code-Erstellung. Es hängt davon ab, was Sie ursprünglich automatisieren wollten.

Auch Sie wies darauf hin, dass die VBScript-Code-Schnipsel nacheinander erstellt, modifiziert und mehrfach von einer RhinoScript-Hauptlaufzeitumgebung ausgeführt werden. Es ist also nicht einmal klar, warum es notwendig ist, ein "Multiprozess" -Modell zu erstellen. Warum nicht jedes Snippet erstellen und an ExecuteGlobal übergeben, wie in meinem obigen Beispiel?

+0

Vielen Dank für die Antwort - Ich denke, ich brauche den "anderen Trick", um den erstellten Code gleichzeitig auszuführen ... – Jarek

+0

@ Jarek Es gibt "Multiprozess" VBScript-Implementierung, aber es funktioniert nur für WSH (sollte gestartet werden '.VBS-Datei auf einem Laufwerk gespeichert und hat "WScript" -Objekt zugänglich. Wie ich jetzt anhand Ihres Kommentars sehen kann, verwenden Sie RhinoScript, das eigentlich eine Variante von WSH VBS ist, und ich vermute, dass weder die Skriptdatei noch ein 'WScript'-Objekt auf einem Laufwerk gespeichert ist. – omegastripes

+0

Ich sehe; Jetzt gibt es tatsächlich eine VBScript-Datei auf dem Laufwerk, die von RhinoScript on-the-fly erstellt wird, und alles funktioniert gut und Multithread. Was ich versuchte zu sehen, ist, wenn ich das gleiche tun kann, ohne die Datei zu speichern, einfach aus dem Speicher laufen, um mehr Geschwindigkeit zu erreichen. Vielen Dank, dass Sie sich das angeschaut haben. – Jarek