如何在.exe中调用和执行VBScript命令和函数?

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

这个问题可能有点愚蠢,但我很好奇这是否可能。 我有一个名为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文件,并以某种方式处理它。但是怎么做呢?我怎么知道我读的这行是函数还是变量?或者两者都有?如何处理它们

有什么办法吗

希望我想要的是可以理解的


谢谢

到目前为止,实现这一点最简单的方法是在“test.vbs”文件中包含“library.vbs”

例如:

Library.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脚本Visual Basic,但它可以满足您的需要

采取的步骤:

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

    公共类库

    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

  • 单击Project->ClassLibrary1属性

  • 单击“编译”并选中“注册COM互操作”框
  • 单击构建->构建解决方案
  • 您现在有了一个test.vbs可以使用的库:

    Set myLib = CreateObject("ClassLibrary1.OurLibrary")
    
    mySource = "C:\mytextfile1.txt"
    myDest = "C:\mytextfile2.txt"
    
    myLib.mycopy mySource, myDest
    
    如果需要将like me test.vbs称为
    C:\Windows\SysWOW64\cscript.exe test.vbs


    有关在Visual Basic中创建COM类的详细信息,请参见此处:

    是的,您是对的。我现在就是这么做的,但是明文是个大问题。使用ScriptCryptor生成的.exe teest.vbs,作为exe参数的内容我可以使用这些函数。效果很好。问题是“只有”复杂的陈述。如果我读了一行,我可以使用Execute或ExecuteGlobal来执行当前行,但是如果该行是一个复杂的语句,并且语法停留在更多的行中,那么我将得到一个语法错误。示例`如果Architecture=“x86”那么a=10 b=4否则a=0 b=0 End If`在本例中,如果我读取一行并执行它,我会得到一个……语法错误,因为没有Else或End If。我在艰难的路上想。也许可以编写一个小函数来读取该行,如果没有结束if,则读取它直到找到为止,将该行存储在变量中,然后执行它。这在理论上是可行的。但处理每种可能的语法并不是那么简单。理论上,这会满足我的要求。但谁知道我忘记了哪件事呢?:)我必须在第一个注释中尝试一下,我想把它写在不同的行中。