【问题标题】:How to call and execute VBScript commands and functions in an .exe?如何在 .exe 中调用和执行 VBScript 命令和函数?
【发布时间】:2014-06-11 03:56:25
【问题描述】:

这个问题可能有点愚蠢,但我很好奇它是否可能。 我有一个名为 library.xxx 的文件(包含 vbscript 代码),其中包含预定义的函数。我还有另一个文件 test.vbs(也包含 vbscript 代码,只是在这里我使用了 library.xxx 中定义的函数)。在 test.vbs 中,该库是“包含”的,这意味着,我可以使用 library.xxx 中的函数。例如,有一个名为 ProgramFiles 的函数,如果我在 test.vbs 中调用它,我将收到 Program Files 文件夹位置。

问题是,library.xxx 以这种方式可见。有一个名为 ScriptCryptor 的应用程序。使用这个应用程序,我可以打开我的 library.xxx 并制作一个 .exe,这对我来说会更好,因为它不是明文。

我现在的问题是,如何执行 test.vbs 中调用的命令?我想我应该逐行阅读 test.vbs 文件,并以某种方式处理它。但是怎么做?我怎么知道我读的那行是一个函数还是一个变量?或两者?以及如何处理?

有没有办法做到这一点?

希望我想要什么是可以理解的。

谢谢!

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    到目前为止,最简单的方法是将“library.vbs”包含到“test.vbs”文件中。

    例如:

    库.vbs:

    Function ProgramFiles()
    
        ProgramFiles = "C:\Foo"
    
    End Function
    

    test.vbs:

    sub includeFile (fSpec)
        dim fileSys, file, fileData
        set fileSys = createObject ("Scripting.FileSystemObject")
        set file = fileSys.openTextFile (fSpec)
        fileData = file.readAll ()
        file.close
        executeGlobal fileData
        set file = nothing
        set fileSys = nothing
    end sub
    
    includeFile "library3.vbs"
    
    wscript.echo ProgramFiles
    

    您的问题似乎表明您可能已经这样做了,如果您这样做了,我深表歉意。

    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -=-=

    如果明文确实让您感到困扰,那么从我所看到的情况来看,没有办法使 ScryptCryptor 的可执行文件可用于您的 vbscript。

    相反,您可以创建一个 COM 库 DLL 用作 test.vbs 文件中的对象。

    这样做的缺点是需要学习一门新语言。 Visual Studio Visual Basic 肯定不同于 Windows Shell Script Visual Basic,但它可以满足您的需求。

    采取的步骤:

    1. 下载适用于 Windows 桌面的 Visual Studio 2013 Express(或 Ultimate 试用版或任何您认为适合您的版本)
    2. 以管理员身份打开 Visual Studio
    3. 创建一个新项目。在“Visual Basic”模板下选择一个“类库”
    4. 复制粘贴下面的代码

      <ComClass(OurLibrary.ClassId, OurLibrary.InterfaceId, OurLibrary.EventsId)> Public Class OurLibrary

      Private userNameValue As String
      
      Public Const ClassId As String = "40491A82-D53A-46A6-B7E0-1CDF78A33AB6"
      Public Const InterfaceId As String = "B49C996C-B039-471D-BF17-0DDA5B3CF517"
      Public Const EventsId As String = "6245E3DD-DEB5-4B75-AC03-F4430BC18FDE"
      
      Public Sub New()
      
          MyBase.New()
      
      End Sub
      
      Public Sub mycopy(mySource As String, myDest As String)
      
          My.Computer.FileSystem.CopyFile(mySource, myDest, True)
      
      End Sub
      

      End Class

    5. 点击项目 -> ClassLibrary1 属性

    6. 单击“编译”并选中“注册 COM 互操作”复选框
    7. 点击构建 -> 构建解决方案

    您现在有了一个 test.vbs 可以使用的库:

    Set myLib = CreateObject("ClassLibrary1.OurLibrary")
    
    mySource = "C:\mytextfile1.txt"
    myDest = "C:\mytextfile2.txt"
    
    myLib.mycopy mySource, myDest
    

    如果你喜欢我 test.vbs 需要被称为C:\Windows\SysWOW64\cscript.exe test.vbs

    有关在 Visual Basic 中创建 COM 类的更多信息,请参见此处:Walkthrough: Creating COM Objects with Visual Basic

    【讨论】:

    • 是的,你是对的。这就是我现在所做的,但明文是个大问题。使用 ScriptCryptor 生成的 .exe teest.vbs,作为 exe 的参数,我能够使用这些功能。那工作得很好。问题“仅”在于复杂的陈述。如果我读到一行,我可以使用 Execute 或 ExecuteGlobal 来执行当前行,但是如果该行是一个语法复杂的语句,并且从更多行开始,那么我会得到一个语法错误。示例 'If Architecture = "x86" Then a=10 b=4 Else a=0 b=0 End If' 在这种情况下,如果我读取一行并执行它,我会得到一个 ...
    • ...语法错误,因为没有 else 也没有 End If。我在艰难的路上想。也许可以写一个小函数来读取该行,如果没有End If,则读取它直到找到,将这些行存储在一个变量中,然后执行它。这在理论上是可行的。但是处理所有可能的语法并不是那么简单。从理论上讲,这会做我想要的。但是谁知道我忘记了哪个案例? :) 我必须试一试
    • 在第一条评论中我想把它写在单独的行中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2011-07-24
    • 2018-09-23
    相关资源
    最近更新 更多