2

現在、文字列の配列から「オンザフライ」で2番目のスクリプトを作成し、それを外部secondfile.vbsファイルに書き込むことにより、メインのvbscriptから新しいvbscriptWshShell.Run "C:\secondfile.vbs"を実行しています。

私が抱えている問題は、何度も繰り返す必要があるため、FSO を使用して新しい vbs ファイルを書き込むと、プロセスが少し遅くなることです。これを解消しようとしています。物理ファイルを作成せずにメモリから vbscript を実行する方法はありますか? スクリプトを文字列として取得し、独立した vbscript として直接実行する方法を探しています。ご提案いただきありがとうございます。

現在の仕組みを簡略化したコードを次に示します。

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
4

1 に答える 1

2

WSH VB スクリプトを実行しながらコードを実行する最も簡単な方法は、コードをExecuteGlobal関数に渡すことです (またはExecuteローカル スコープを使用します)。

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

strCode = Join(arrCode, vbCrLf)

ExecuteGlobal strCode

リンクでVBScript の「マルチプロセス」実装を見つけることができます。このコードは、WSH スクリプト エンジンに対してのみ機能します。RhinoScript 環境では、違いがあるため、コードを再加工して適応させる必要があります。RhinoScript にはWScript使用可能なオブジェクトがないため、起動された RhinoScript ファイルへのパスを取得できないという問題があります。唯一の方法は、コードにパスをハードコーディングすることです。また、WSH VBS ファイル拡張子は.vbsで、RhinoScript の場合は.rvbです。

コメントからいくつかのことが明確になりました。オンザフライでコードを実行する速度を上げようとしていると書きましたが、そのWshShell.SendKeys方法はファイルを保存して実行するよりもはるかに時間がかかり、信頼性が低いことに注意してください。私の手がかりは、RhinoScript オブジェクト モデルアプリケーション メソッドの.SendKeys使用を避け、自動化の実装を試みることです。おそらく、その方法でコードを作成する必要はありません。最初に何を自動化するつもりだったかによって異なります。

また、vbscript コード スニペットが 1 つのメイン RhinoScript ランタイムから 1 つずつ作成、変更、実行されることも指摘しました。では、最初のスクリプトを続けても、「マルチプロセス」モデルを作成する必要がある理由がよくわかりません。ExecuteGlobal上記の例のように、各スニペットを作成して渡さないのはなぜですか?

于 2016-04-22T20:36:52.473 に答える