Reply to comment

Enumerating Environment variables

One of the way to enumerate the Environment Variables is by accessing _environ global variable. The GetEnvironmentStrings function provides another way by returning a pointer to the environment block of the calling process. It can also be done using WMI Win32_Environment Class.

The Windows API support class is used to handle Windows API structures.

This is sample code. Add error handling and adjust to your requirements as necessary.

Retrieve the list of Environment Variables at the time when Windows started.
A handy Array Browser utility that displays an array content is used in above code to see the result list.

#DEFINE ccEnvVarName 1
#DEFINE ccEnvVarValue 2
 
DECLARE Long GetModuleHandle IN win32api String
DECLARE Long GetProcAddress IN win32api Long, String
 
loWas = NEWOBJECT("WinApiSupport", "WinApiSupport.fxp")
 
* Get pointer to the process environment
lnHandle = GetModuleHandle("msvcrt.dll")
lnPtr = GetProcAddress(lnHandle,"_environ")
* It is a pointer to an array of pointers to the environment variables strings
lnPtr = loWas.Long2NumFromBuffer(lnPtr)
 
lnInd = 0
DO WHILE .T.
	* Pointer to the next environment variable string
	lnAddress = loWas.Long2NumFromBuffer(lnPtr + lnInd * 4)
	IF lnAddress = 0 
		EXIT
	ENDIF
 
	* Increment it now so we can use it to resize the array
	lnInd = lnInd + 1
	DIMENSION laEnvVars[lnInd, 2]
	* Copy string to a memory variable
	lcEnvItem = loWas.StrZCopy(lnAddress)
	* Extract variable name
	laEnvVars[m.lnInd, ccEnvVarName] = GETWORDNUM(lcEnvItem,1,"=")
	* Get variable value
	laEnvVars[m.lnInd, ccEnvVarValue] = GETWORDNUM(lcEnvItem,2,"=")
	*laEnvVars[m.lnInd, ccEnvVarValue] = GETENV(laEnvVars[m.lnInd, ccEnvVarName])
ENDDO
 
* Displays the array content in a Browser
= browarr(@laEnvVars)

Retrieve the list of Environment Variables for the current process at the time when application started. The list can be changed by application using SetEnvironmentVariable function.

#DEFINE ccEnvVarName 1
#DEFINE ccEnvVarValue 2
 
DECLARE Long GetEnvironmentStrings IN WIN32API 
DECLARE Long FreeEnvironmentStrings IN WIN32API Long lpszEnvironmentBlock
 
loWas = NEWOBJECT("WinApiSupport", "WinApiSupport.fxp")
 
* Get current process environment variables block
lnPtr = GetEnvironmentStrings()
 
lnAddress = lnPtr 
lnInd = 1
DO WHILE .T.
	* Copy string to a memory variable
	lcEnvItem = loWas.StrZCopy(lnAddress )
	IF EMPTY(lcEnvItem)
		EXIT
	ENDIF
 
	DIMENSION laEnvVars[lnInd, 2]
	* Extract variable name
	laEnvVars[m.lnInd, ccEnvVarName] = GETWORDNUM(lcEnvItem,1,"=")
	* Get variable value
	laEnvVars[m.lnInd, ccEnvVarValue] = GETWORDNUM(lcEnvItem,2,"=")
	*laEnvVars[m.lnInd, ccEnvVarValue] = GETENV(laEnvVars[m.lnInd, ccEnvVarName])
 
	* Next item
	lnAddress = lnAddress + LEN(lcEnvItem) + 1
	* Increment 
	lnInd = lnInd + 1
 
ENDDO
 
* Release the environment variables block
= FreeEnvironmentStrings(lnPtr)
 
* Displays the array content in a Browser
= browarr(@laEnvVars)

Creating, Setting, Deleting and Reading of Environment variables

CLEAR
 
* Create/Set/Delete a variable
DECLARE Long SetEnvironmentVariable IN WIN32API String lpName, String lpValue
* Add one
= SetEnvironmentVariable("MyVar01", "MyVal 01")
* Add one more
= SetEnvironmentVariable("MyVar02", "MyVal 02")
* Delete one
= SetEnvironmentVariable("MyVar02", Null)
 
? GetEnvVar("MyVar01")
? GetEnvVar("MyVar02")
? GetEnvVar("OS")
 
RETURN
 
* The function returns value of an environment variable of the current process including the ones created with SetEnvironmentVariable. 
*  The GETENV() function does not return values for the later.
FUNCTION GetEnvVar(tnVarName)
LOCAL lcBuffer, lnLen, lcVarVal
	* Read a variable
	DECLARE Long GetEnvironmentVariable IN WIN32API String lpName, String @lpBuffer, Long nSize
	lcBuffer = SPACE(4096)
	lnLen = GetEnvironmentVariable(tnVarName, @lcBuffer, LEN(lcBuffer))
	lcVarVal = ""
	IF lnLen > 0
		lcVarVal = LEFT(lcBuffer, lnLen)
	ENDIF
	RETURN lcVarVal
ENDFUNC

Retrieve the list of Environment Variables using WMI.

SET MEMOWIDTH TO 1024
CLEAR
 
LOCAL loWMI, loEnvCol, loEnvVar
loLocator	= CREATEOBJECT('WbemScripting.SWbemLocator')
loWMI		= loLocator.ConnectServer()
loEnvCol	= loWMI.ExecQuery("select * from Win32_Environment")
 
FOR EACH  loEnvVar in loEnvCol
	WITH loEnvVar
		? .Name, .SystemVariable AT 25, .UserName, .VariableValue
	ENDWITH 
ENDFOR 

Reply

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <java>, <powershell>, <tsql>, <visualfoxpro>. The supported tag styles are: <foo>, [foo].
  • Lines and paragraphs break automatically.
  • Web page addresses and e-mail addresses turn into links automatically.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.