Can I pick up environment variables in vbscript WSH script?

70,935

Solution 1

Here's an example (taken from here):

Set oShell = CreateObject( "WScript.Shell" )
user=oShell.ExpandEnvironmentStrings("%UserName%")
comp=oShell.ExpandEnvironmentStrings("%ComputerName%")
WScript.Echo user & " " & comp

Solution 2

The existing answers are all helpful, but let me attempt a pragmatic summary:

Typically, you want the current process's definition of an environment variable:

CreateObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%")

This is the equivalent of (note the absence of % around the variable name):

CreateObject("WScript.Shell").Environment("Process").Item("TEMP")

Caveat: Do not omit the ("Process) part: if you do, you'll get the system scope's definition of the variable; see below.

.ExpandEnvironmentStrings is conceptually simpler and more flexible: It can expand arbitrary strings with embedded (%-enclosed) environment-variable references; e.g.:

CreateObject("WScript.Shell").ExpandEnvironmentStrings("My name is %USERNAME%")

On rare occasions you may have to access environment-variable definitions from a specific scope (other than the current process's).

  sScope = "System" ' May be: "Process", "User", "Volatile", "System"
  CreateObject("WScript.Shell").Environment(sScope).Item("TEMP")

Note: As stated above, omitting the scope argument defaults to the System scope.

Caveat: Accessing a value this way does not expand it: Environment-variable values can be nested: they can refer to other environment variables.
In the example above, the return value is %SystemRoot%\TEMP, which contains the unexpanded reference to %SystemRoot%.
To expand the result, pass it to .ExpandEnvironmentStrings(), as demonstrated above.

Solution 3

From here ...

Set WshShell = WScript.CreateObject("WScript.Shell")

Set WshProccessEnv = WshShell.Environment("Process")
Set WshSysEnv = WshShell.Environment("System")

Wscript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")
Wscript.Echo WshProccessEnv("Path")

Also, much more detail on TechNet.

Solution 4

Set WshShell = CreateObject("WScript.Shell")    
Set WshEnv = WshShell.Environment
WScript.Echo "WINDIR=" & WshEnv.Item("WINDIR")  & vbCrLf & vbCrLf   
Set WshShell = CreateObject("WScript.Shell")
WScript.Echo "Environment System:"              & vbCrLf & _ 
         "..............................................."

For Each IEnv In WshShell.Environment("System")
    WScript.Echo IEnv
Next

WScript.Echo vbCrLf & "Environment User:"       & vbCrLf & _   
        "..............................................."

For Each IEnv In WshShell.Environment("User") 
    WScript.Echo IEnv
Next

WScript.Echo vbCrLf & "Environment Volatile:"   & vbCrLf & _ 
       "..............................................."

For Each IEnv In WshShell.Environment("Volatile")
    WScript.Echo IEnv
Next

WScript.Echo vbCrLf & "Environment Process:"    & vbCrLf & _ 
       "..............................................."

For Each IEnv In WshShell.Environment("Process")
    WScript.Echo IEnv
Next
Share:
70,935
mike nelson
Author by

mike nelson

I run web development company beweb in Auckland, New Zealand. I head up an awesome team of full stack web and mobile developers doing HTML/javascript/C# for clients. Creator of Speaking Email, the app that reads out your emails (on iPhone or Android). Written with javascript/HTML5 using Cordova/PhoneGap, native text to speech and plenty of email parsing.

Updated on January 31, 2020

Comments

  • mike nelson
    mike nelson over 4 years

    Is is possible to read system environment variables in a Windows Scripting Host (WSH) VBS script?

    (I am writing a VBScript using Windows Scripting Host for task for a Cruise Control and want to pick up the project build URL.)

  • mklement0
    mklement0 over 7 years
    The object returned by CreateObject("WScript.Network" does not provide generic environment-variable access, it just happens to expose 3 values as properties that are also reflected in environment variables: ComputerName, UserDomain, and UserName. The reason that your last example doesn't work is that WshShell.Environment is the same as WshShell.Environment("System"), and %USERNAME% isn't defined in the system scope.