How can I convert a VBScript to an executable (EXE) file? [closed]
Asked Answered
E

6

20

I'd looked around for information to convert a VBScript (*.vbs) to an executable and realised that most of the tools available are actually wrapping the script in the executable. Tried a few tools and it didn't worked as well as expected. I tried IExpress (in Windows XP) to create the Win32 self extraction cab file but it didn't invoke properly on Windows 7 machines.

So I am looking for a way to compile the vbs into exe. I am trying to port my current script into VB Express 2008 but I have no prior knowledge of Visual Basic here. There are a lot of errors but I am still trying around.

Can anyone please advice on how should I proceed from here? I mean, would a self extracting archive be the way to go instead of a standalone executable file? But say like Winzip I don't know how to make it run the script after extraction.

Any ideas?

Euphrates answered 13/12, 2010 at 3:52 Comment(2)
possible duplicate of VBscript compilerBarner
use the software vbseditFoust
H
21

There is no way to convert a VBScript (.vbs file) into an executable (.exe file) because VBScript is not a compiled language. The process of converting source code into native executable code is called "compilation", and it's not supported by scripting languages like VBScript.

Certainly you can add your script to a self-extracting archive using something like WinZip, but all that will do is compress it. It's doubtful that the file size will shrink noticeably, and since it's a plain-text file to begin with, it's really not necessary to compress it at all. The only purpose of a self-extracting archive is that decompression software (like WinZip) is not required on the end user's computer to be able to extract or "decompress" the file. If it isn't compressed in the first place, this is a moot point.

Alternatively, as you mentioned, there are ways to wrap VBScript code files in a standalone executable file, but these are just wrappers that automatically execute the script (in its current, uncompiled state) when the user double-clicks on the .exe file. I suppose that can have its benefits, but it doesn't sound like what you're looking for.

In order to truly convert your VBScript into an executable file, you're going to have to rewrite it in another language that can be compiled. Visual Basic 6 (the latest version of VB, before the .NET Framework was introduced) is extremely similar in syntax to VBScript, but does support compiling to native code. If you move your VBScript code to VB 6, you can compile it into a native executable. Running the .exe file will require that the user has the VB 6 Run-time libraries installed, but they come built into most versions of Windows that are found now in the wild.

Alternatively, you could go ahead and make the jump to Visual Basic .NET, which remains somewhat similar in syntax to VB 6 and VBScript (although it won't be anywhere near a cut-and-paste migration). VB.NET programs will also compile to an .exe file, but they require the .NET Framework runtime to be installed on the user's computer. Fortunately, this has also become commonplace, and it can be easily redistributed if your users don't happen to have it. You mentioned going this route in your question (porting your current script in to VB Express 2008, which uses VB.NET), but that you were getting a lot of errors. That's what I mean about it being far from a cut-and-paste migration. There are some huge differences between VB 6/VBScript and VB.NET, despite some superficial syntactical similarities. If you want help migrating over your VBScript, you could post a question here on Stack Overflow. Ultimately, this is probably the best way to do what you want, but I can't promise you that it will be simple.

Hibbs answered 13/12, 2010 at 7:7 Comment(10)
@Cody Gray: Hi thanks for the reply. Well if possible I don't mind having a SFX and launching the script but to what I'd tried mostly the script doesn't get executed. The closest was the exe generated by iexpress but somehow I can't figure out why it fails on certain Win7 machines. I might take your advice on posting my VBS code here to get help to migrate to VB.NET since I only have it on my machine. Unless I specifically look for the older version VB6 to compile the code.Euphrates
Answer accepted, ported it successfully to VB.NET @Cody: Any idea the equivalent function for getlocale() [in VB6] to be used in VB.NET? That's the only thing that I can't migrate.Euphrates
@Alex: Glad to hear the port went well for you. I'd say the best equivalent of GetLocale (after a quick Google search to see what exactly it does!) in the .NET Framework is the CultureInfo.LCID property, found in the System.Globalization namespace. And even if this isn't exactly what you're looking for, you're sure to find an equivalent somewhere in the classes under System.Globalization.Hibbs
@Cody: Nice I'll try to implement that using the link you provided. Well it worked for me (the port) but I'm pretty sure that I'm not using the correct syntax/convention to declare (e.g. Wshso = CreateObject("WScript.Shell")). I need to learn VB Express's way of doing things I guess.Euphrates
Hmm I don't understand the MSDN coding, I Did this instead: Dim locale As System.Globalization.CultureInfo then locale = System.Globalization.CultureInfo.CurrentCulture() after that I manipulate locale from there.Euphrates
@Alex: Yeah, that will work. If all you want is the culture identifier, you can just use this code: Dim locale As Integer = System.Globalization.CultureInfo.CurrentCulture.LCID As you'll see, some things are a little different in VB.NET, like shared/static classes that you don't need to instantiate to access their properties or methods.Hibbs
@Cody: I see thanks. What about the WScript.Shell declaration? IINM from a few sites they use Dim Wshso As Shell or something and then you have to import a library? How does that differ from doing this: Wshso = CreateObject("WScript.Shell"))Euphrates
@Alex: I don't think there's an official .NET way to do that, because you're using a function design for VBScript. As you've discovered, that will work, and if this is a simple script, you might want to just leave it like that. I don't know what the other sites are advocating, but doing this the right .NET way is probably going to depend on what exactly you're doing with the WScript.Shell object rather than changing how you create it.Hibbs
+1 that explains. I was wondering whether there's certain conventions in .NET as I know that it would be better to define something like Dim foo As Bar instead of Dim foo alone. But I'm more used to VBScript type of coding it, so I guess I'll stick to it then for my simple script. =DEuphrates
+1 this is a very good answer!Brownout
W
18

You can use VBSedit software to convert your VBS code to .exe file. You can download free version from Internet and installtion vbsedit applilcation on your system and convert the files to exe format.

Vbsedit is a good application for VBscripter's

Whoso answered 5/12, 2011 at 18:40 Comment(4)
Here is the link as well vbsedit.comAntofagasta
VBSedit was super easy to make an exe!Sample
Unfortunately the evaluation version only supports editor. The vbs to exe works but when we call the exe gives a pop-up to purchase a license.Vallie
VBSedit requires you to have VisualStudio Community Edition installe to create an exe.Mi
S
3

Here are a couple possible solutions...

I have not tried all of these myself yet, but I will be trying them all soon.

Note: I do not have any personal or financial connection to any of these tools.

1) VB Script to EXE Converter (NOT Compiler): (Free)
vbs2exe.com.

The exe produced appears to be a true EXE.

From their website:

VBS to EXE is a free online converter that doesn't only convert your vbs files into exe but it also:

1- Encrypt your vbs file source code using 128 bit key.
2- Allows you to call win32 API
3- If you have troubles with windows vista especially when UAC is enabled then you may give VBS to EXE a try.
4- No need for wscript.exe to run your vbs anymore.
5- Your script is never saved to the hard disk like some others converters. it is a TRUE exe not an extractor.

This solution should work even if wscript/cscript is not installed on the computer.

Basically, this creates a true .EXE file. Inside the created .EXE is an "engine" that replaces wscript/cscript, and an encrypted copy of your VB Script code. This replacement engine executes your code IN MEMORY without calling wscript/cscript to do it.


2) Compile and Convert VBS to EXE...:
ExeScript

The current version is 3.5.

This is NOT a Free solution. They have a 15 day trial. After that, you need to buy a license for a hefty $44.96 (Home License/noncommercial), or $89.95 (Business License/commercial usage).

It seems to work in a similar way to the previous solution.

According to a forum post there:
Post: "A Exe file still need Windows Scripting Host (WSH) ??"

WSH is not required if "Compile" option was used, since ExeScript
implements it's own scripting host. ...


3) Encrypt the script with Microsoft's ".vbs to .vbe" encryption tool.

Apparently, this does not work for Windows 7/8, and it is possible there are ways to "decrypt" the .vbe file. At the time of writing this, I could not find a working link to download this. If I find one, I will add it to this answer.

Samsara answered 21/12, 2012 at 6:56 Comment(0)
C
3

More info

To find a compiler, you'll have 1 per .net version installed, type in a command prompt.

 

dir c:\Windows\Microsoft.NET\vbc.exe /a/s

Windows Forms

 

For a Windows Forms version (no console window and we don't get around to actually creating any forms - though you can if you want).

Compile line in a command prompt.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /t:winexe "%userprofile%\desktop\VBS2Exe.vb"

 

Text for VBS2EXE.vb

Imports System.Windows.Forms 

Partial Class MyForm : Inherits Form 

Private Sub InitializeComponent() 


End Sub

Public Sub New() 

InitializeComponent() 

End Sub

Public Shared Sub Main() 

Dim sc as object 
Dim Scrpt as string

sc = createObject("MSScriptControl.ScriptControl")

Scrpt = "msgbox " & chr(34) & "Hi there I'm a form" & chr(34)

With SC 
.Language = "VBScript" 
.UseSafeSubset = False 
.AllowUI = True 
End With


sc.addcode(Scrpt)


End Sub

End Class

 

Using these optional parameters gives you an icon and manifest. A manifest allows you to specify run as normal, run elevated if admin, only run elevated.

/win32icon: Specifies a Win32 icon file (.ico) for the default Win32 resources.

/win32manifest: The provided file is embedded in the manifest section of the output PE.

In theory, I have UAC off so can't test, but put this text file on the desktop and call it vbs2exe.manifest, save as UTF-8.

 

The command line

 

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /t:winexe /win32manifest:"%userprofile%\desktop\VBS2Exe.manifest" "%userprofile%\desktop\VBS2Exe.vb"

The manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" 
  processorArchitecture="*" name="VBS2EXE" type="win32" /> 
  <description>Script to Exe</description> 
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
  <security> <requestedPrivileges> 
  <requestedExecutionLevel level="requireAdministrator" 
  uiAccess="false" /> </requestedPrivileges> 
  </security> </trustInfo> </assembly>

Hopefully it will now ONLY run as admin.

 

Give Access To a Host's Objects

 

Here's an example giving the vbscript access to a .NET object.

Imports System.Windows.Forms 

Partial Class MyForm : Inherits Form 

Private Sub InitializeComponent() 


End Sub 

Public Sub New() 

InitializeComponent() 

End Sub 

Public Shared Sub Main() 

Dim sc as object
Dim Scrpt as string 

sc = createObject("MSScriptControl.ScriptControl") 

Scrpt = "msgbox " & chr(34) & "Hi there I'm a form" & chr(34) & ":msgbox meScript.state" 

With SC
.Language = "VBScript"
.UseSafeSubset = False
.AllowUI = True
.addobject("meScript", SC, true)
End With 


sc.addcode(Scrpt) 


End Sub 

End Class 

 

To Embed version info

 

Download vbs2exe.res file from https://skydrive.live.com/redir?resid=E2F0CE17A268A4FA!121 and put on desktop.

 

Download ResHacker from http://www.angusj.com/resourcehacker

 

Open vbs2exe.res file in ResHacker. Edit away. Click Compile button. Click File menu - Save.

 

Type

 

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /t:winexe /win32manifest:"%userprofile%\desktop\VBS2Exe.manifest" /win32resource:"%userprofile%\desktop\VBS2Exe.res" "%userprofile%\desktop\VBS2Exe.vb"
Clearstory answered 6/10, 2013 at 22:5 Comment(0)
G
0

You can do this with PureBasic and MsScriptControl

All you need to do is pasting the MsScriptControl to the Purebasic editor and add something like this below

InitScriptControl()
SCtr_AddCode("MsgBox 1")
Gyrostatic answered 14/4, 2015 at 8:45 Comment(0)
T
0

You can try VbsEdit. Get the latest version from Adersoft's VbsEdit http://www.vbsedit.com its a small download but it is a powerful tool to create and edit vbs files and convert them into executables without unpacking to temporary folder. (unless you get an old version like version 4.x.x.x) I've been using this program since 2008, and it's free to evaluate forever but comes with a reminder to activate and each time you Start your script from the vbsedit window you will have to wait a few seconds, Or you could purchase it for $60 to remove those minor annoyances.
Unlike ScriptCryptor, the converted exe won't have any limitations if you are still evaluating, it will run without any unwanted additional windows.

Tarter answered 20/4, 2016 at 5:5 Comment(1)
Unfortunately the evaluation version only supports editor. The vbs to exe works but when we call the exe gives a pop-up to purchase a license.Vallie

© 2022 - 2024 — McMap. All rights reserved.