Using ExecuteScriptText to get a list of all environment variables and their values

Use the function below to be able to get all system environment variables in a string. You can then use StringByKey to get the value of a specific variable, if you wish. This function has been tested on both Windows and Macintosh. Note that the environment variables that are set may vary with the different operating systems, so even though the code itself is cross platform, you may only be able to read certain variables on one operating system if it's not set on the other system.


NOTE: If you're using Igor 7 or above, there's a much easier way to do this. Use the new built-in function
GetEnvironmentVariable
. If you need the values of all environment variables, call
GetEnvironmentVariable("=")
. Otherwise, to get the value of a specific environment variable, call
GetEnvironmentVariable("USER")
, for example, to get the value of the "USER" environment variable.


//**
// Using ExecuteScriptText, gets the environment variables.
// Variables are returned as a carriage-return-separated
// string.
//
// Usage examples:
// 	print GetEnvironmentVariables()		// Prints all variables to Igor's command history
// 	String sys_path = StringByKey("PATH", GetEnvironmentVariables(), "=", "\r")
//*
Function/S GetEnvironmentVariables()

	String envInfoString = ""

	
	// This has to be done differently depending on the operating system.
	String platform = IgorInfo(2)
	String errorMessage
	StrSwitch (platform)
		Case "Windows":
			try
				// Do some setup.
				String tmpDir = SpecialDirPath("Temporary", 0, 0, 0)
				AbortOnValue (numtype(strlen(tmpDir)) != 0 || !(strlen(tmpDir) > 0)), 1
	
				
				// Make sure that the directory we just got is, in fact, a directory.
				GetFileFolderInfo/Q tmpDir
				AbortOnValue (V_Flag >= 0 && !V_isFolder), 3
				
				// Set an Igor symbolic path to the temporary directory.
				String tmpDirectoryPath = UniqueName("tmpPath", 12, 0)
				NewPath/Q $(tmpDirectoryPath), tmpDir
				AbortOnValue (V_flag), 5		// Setting of the new path failed.
				
				// Write a temporary batch file to the temporary directory that will
				// call the "set" command from the command shell and save the
				// output of the command to a temporary file.
				String tempBatFileName, tempResultsFileName
				String tempBatFileFullPath, tempResultsFileFullPath
				Variable tempBatFileRefNum, tempResultsFileRefNum
				
				sprintf tempBatFileName, "IgorGetEnvironmentVars_%.4u.bat", abs(trunc(StopMsTimer(-2)))
				Open/P=$(tmpDirectoryPath)/T=".bat"/Z=1 tempBatFileRefNum as tempBatFileName
				AbortOnValue (V_flag != 0), 7
	
				// Add a path separator character to the end of the path, if necessary, and add on the file name.
				tempBatFileFullPath = ParseFilePath(2, tmpDir, ":", 0, 0) + tempBatFileName
				
				// Convert the path into a windows path that uses "\" as the path separator.
				tempBatFileFullPath = ParseFilePath(5, tempBatFileFullPath, "\\", 0, 0)
	
				sprintf tempResultsFileName, "IgorGetEnvironmentVars_%.4u.txt", abs(trunc(StopMsTimer(-2)))			
	
				// Add a path separator character to the end of the path, if necessary, and add on the file name.
				tempResultsFileFullPath = ParseFilePath(2, tmpDir, ":", 0, 0) + tempResultsFileName
				
				// Convert the path into a windows path that uses "\" as the path separator.
				tempResultsFileFullPath = ParseFilePath(5, tempResultsFileFullPath, "\\", 0, 0)
	
				fprintf tempBatFileRefNum, "set > \"%s\"\r\n", tempResultsFileFullPath
				Close tempBatFileRefNum
				
				// Call the batch file we just created.  Timeout after 2 seconds if this doesn't succeed.
				String scriptText
				sprintf scriptText, "cmd.exe /C \"%s\"", tempBatFileFullPath
				ExecuteScriptText/W=2/Z scriptText
				
				// Check for an error.
				AbortOnValue (V_flag != 0), 9
				
				// Check that the temporary results file exists.
				GetFileFolderInfo/Z=1/Q/P=$(tmpDirectoryPath) tempResultsFileName
				AbortOnValue (V_flag != 0 || !(V_isFile)), 10
				
				// Get the results from the temporary file created by the batch file.
				Open/P=$(tmpDirectoryPath)/R/Z=1 tempResultsFileRefNum as tempResultsFileName
				AbortOnValue (V_flag != 0), 12

				String buffer
				do
					FReadLine tempResultsFileRefNum, buffer
					if (strlen(buffer) <= 0)
						break
					else
						envInfoString += buffer
					endif
				while (1)	
				Close tempResultsFileRefNum
				
				// Delete the temporary batch file and temporary results file.
				DeleteFile/P=$(tmpDirectoryPath)/Z=1 tempBatFileName
				DeleteFile/P=$(tmpDirectoryPath)/Z=1 tempResultsFileName
				// If we get an error here we don't really care.  We've already got
				// the goods, so just run.
				break
			catch
				// Error handling
				Switch (V_abortCode)
					Case 1:
						errorMessage = "Could not locate the operating system's temporary directory, so can't get environment variables."
						break
					Case 3:
						errorMessage = "Could not locate the operating system's temporary directory, so can't get environment variables."
						break
					Case 5:
						errorMessage = "Igor was unable to create a symbolic path to the temporary file directory."
						break
					Case 7:
						errorMessage = "Igor was unable to create a batch file in the temporary directory."
						break
					Case 9:
						errorMessage = "Igor was unable to execute the batch file to read the environment variables."
						break
					Case 10:
						errorMessage = "Igor was unable to locate or read the temporary file containing environment variables."
						break
					Case 12:
						errorMessage = "Igor was unable to open the temporary file containing environment variables."
						break
					default:
						errorMessage = "An unspecified error occurred while trying to read the environment variables."						
				EndSwitch
				print errorMessage
				KillPath/Z $(tmpDirectoryPath)
				return ""
			
			endtry
			
		Case "Macintosh":
			// This is a lot easier on the Macintosh because we can just use AppleScript.
			try
				String appleScriptCommand = "do shell script \"env\""
				ExecuteScriptText/Z appleScriptCommand
				AbortOnValue V_flag, 1
				
				envInfoString = S_Value
			catch
				errorMessage = "Could not execute AppleScript command."
				print errorMessage
				return ""				
			endtry
			break
	EndSwitch
	return envInfoString
End

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More