Where are the default powershell environment variables physically stored?

This topic contains 2 replies, has 2 voices, and was last updated by Profile photo of Eric Swiggum Eric Swiggum 2 years, 4 months ago.

  • Author
    Posts
  • #17451
    Profile photo of Eric Swiggum
    Eric Swiggum
    Participant

    I am new to powershell, I have a background in k-shell/bash. Where are the default profile/environment variables physically stored? In bash everything is stored in .profile and there is no need to create your profile file. I echo $home & $profile and get values for each, but I am not seeing a profile file anywhere! When I look up the value of PSModulePath under system variables that value is not even matching what I echo for $psmodulepath in powershell? What's going on here? Where are they coming from? They have to be stored somewhere?

  • #17452
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    There are a few different concepts in play here:

    Environment Variables, such as PSModulePath, have a few different "scopes" (for lack of a better term). There are System environment variables that apply to all users, User environment variables that apply to all processes for a particular user, and Process environment variables which are set at runtime, but not saved. When you start a new process, you inherit values from all three sets (including Process variables from whatever parent process launched the new one.)

    $profile is a variable which contains several paths to scripts that PowerShell will execute on startup if they exist, but the folders and scripts themselves do not exist by default. If you want a profile, you have to create it. For example, this bit of code will create a profile.ps1 script (which executes for both PowerShell.exe and the ISE) for the current user, if it doesn't already exist, then opens that profile script in the ISE:

    $profilePath = $profile.CurrentUserAllHosts
    $profileFolder = Split-Path $profilePath -Parent
    
    if (-not (Test-Path $profileFolder -PathType Container))
    {
        $null = mkdir $profileFolder
    }
    
    if (-not (Test-Path $profilePath -PathType Leaf))
    {
        $null = New-Item $profilePath -ItemType File
    }
    
    ise $profilePath
    
  • #17457
    Profile photo of Eric Swiggum
    Eric Swiggum
    Participant

    After taking your lead and some further research, it seems that powershell is getting these default values out of the registry, as I suspected:
    HKEY_CURRENT_USER\Volatile Environment for User environment variables
    HKEY_CURRENT_USER\Environment for System environment variables
    HKEY_CURRENT_USER\Software\Microsoft\Windows\Explorer\User Shell Folders

    and elsewhere!

    Thanks Dave!

You must be logged in to reply to this topic.