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 8

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More