Quietly run an executable with session environment variables, in Windows

In Software Engineering, Snippet

“Wrapping” an executable with session environment variables in a script can be used as a basic way to make an executable portable. For example, if the executable depends on a system environment variable, such as %PATH%, the script passes a session PATH variable, to tell the executable where to look for its dependencies, without actually modifying the system PATH. Similarly, if the executable writes to some directory, such as %APPDATA% or %TEMP%, setting session environment variables can redirect the executable’s output (e.g., temporary files).

I will use LONI’s ShapeViewer tool as an example. It is an executable java jar requiring Java 1.6+ and the Java 3D library. Installing the Java 3D library can be annoying, particularly because extra files need to be inserted into the system Java installation. This is sometimes not possible on a loaned laptop or a computer without admin rights to modify the Java installation.

A three-line batch file solves this problem. This assumes that some Java directory has already been prepared with Java 3D files. In this case, this Java directory is in a directory a couple times up the directory tree containing ShapeViewer.jar.

@echo off
set PATH=%CD%\..\..\Java\bin
java -jar ShapeViewer.jar

This works very well, except that it leaves a Windows command line console open. This can also be slightly annoying (e.g. if I’m working on a small laptop screen). Using javaw doesn’t seem to help in this case (javaw is supposed to be equivalent to running java, but without a console window).

Another script in VBScript solves this problem, by calling the batch file above. The zero argument after objShell.Run hides the console window.

' References
' 1. http://stackoverflow.com/questions/6941167/hiding-a-simple-batch-window/6941198#6941198
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("ShapeViewerPortable.bat"), 0, True

But can we avoid having two separate scripts (especially since they’re each a couple lines long)? It turns out that you can set a session environmental variable in VBScript, then run the executable.

' References
' 1. http://wsh2.uw.hu/ch07c.html
Set WshShell = CreateObject("WScript.Shell")
Set objEnv = WshShell.Environment("Process")
objEnv("PATH") = "D:\Portable\Java\bin"
WshShell.Run("java -jar ShapeViewer.jar"), 0, True

Interestingly, relative paths don’t work in PATH. Also note that environmental variables after Windows 98 can also be categorized, in addition to Process, as System, User, and Volatile. So it is also possible to modify a system environmental variable from a VBScript (which would probably require admin rights).

Leave a Reply