Skip to main content

PowerShell scripts to gets a list of folders specified in the PATH environment variable, adds one or more folders to the PATH environment variable, and removing one or more folders from the PATH environment variable.

# ---------------------------------------------------------------
# File: Get-Env-Paths.ps1
# ---------------------------------------------------------------

<#
.SYNOPSIS

    Gets the list of folders specified in the Path environment variable.

.PARAMETER EnvironmentVariableTarget

    Specifies the "scope" to use when querying the Path environment variable
    ("Process", "Machine", or "User"). Defaults to "Process" if the parameter is
    not specified.

.EXAMPLE

    .\Get-Env-Path.ps1
    C:\Windows\system32\WindowsPowerShell\v1.0\
    C:\Windows\system32
    C:\Windows
    C:\Windows\System32\Wbem
    ...

    Description
    -----------
    The output from this example lists each folder in the Path environment
    variable for the current process.

.EXAMPLE

    .\Get-Env-Paths.ps1 User
    C:\NotBackedUp\Public\Toolbox

    Description
    -----------
    The output from this example assumes one folder
    ("C:\NotBackedUp\Public\Toolbox") has previously been added to the
    user's Path environment variable.
#>
param(
    [string] $EnvironmentVariableTarget = "Process"
)

Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"

[string[]] $pathFolders = [Environment]::GetEnvironmentVariable("Path", $EnvironmentVariableTarget) -Split ";"

If ($pathFolders -ne $null)
{
    Write-Output $pathFolders
}

# ---------------------------------------------------------------
# File: Add-Env-Paths.ps1
# ---------------------------------------------------------------

<#
.SYNOPSIS

    Adds one or more folders to the Path environment variable.

.PARAMETER Folders

    Specifies the folders to add to the Path environment variable..

.PARAMETER EnvironmentVariableTarget

    Specifies the "scope" to use for the Path environment variable ("Process",
    "Machine", or "User"). Defaults to "Process" if the parameter is not specified.

.EXAMPLE

    .\Add-Env-Paths.ps1 C:\NotBackedUp\Public\Toolbox
#>
param(
    [parameter(Mandatory = $true, ValueFromPipeline = $true)]
    [string[]] $Folders,
    [string] $EnvironmentVariableTarget = "Process"
)

begin
{
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"

    Write-Verbose "Path environment variable target: $EnvironmentVariableTarget"

    [bool] $isInputFromPipeline = ($PSBoundParameters.ContainsKey("Folders") -eq $false)
    [int] $foldersAdded = 0
    [string[]] $pathFolders = [Environment]::GetEnvironmentVariable("Path", $EnvironmentVariableTarget) -Split ";"
    [Collections.ArrayList] $folderList = New-Object Collections.ArrayList

    $pathFolders | foreach { $folderList.Add($_) | Out-Null }
}

process
{
    If ($isInputFromPipeline -eq $true)
    {
        $items = $_
    }
    Else
    {
        $items = $Folders
    }

    $items | foreach {
        [string] $folder = $_
        [bool] $isFolderInList = $false

        $folderList | foreach {
            If ([string]::Compare($_, $folder, $true) -eq 0)
            {
                Write-Verbose ("The folder ($folder) is already included in the Path environment variable.")
                $isFolderInList = $true
                return
            }
        }

        If ($isFolderInList -eq $false)
        {
            Write-Verbose ("Adding folder ($folder) to Path environment variable...")
            $folderList.Add($folder) | Out-Null
            $foldersAdded++
        }
    }
}

end
{
    If ($foldersAdded -eq 0)
    {
        Write-Verbose ("No changes to the Path environment variable are necessary.")
        return
    }

    [string] $delimitedFolders = $folderList -Join ";"
    [Environment]::SetEnvironmentVariable("Path", $delimitedFolders, $EnvironmentVariableTarget)

    Write-Verbose ("Successfully added $foldersAdded folder(s) to Path environment variable.")
}

# ---------------------------------------------------------------
# File: Remove-Env-Paths.ps1
# ---------------------------------------------------------------

<#
.SYNOPSIS

    Removes one or more folders from the Path environment variable.

.PARAMETER Folders

    Specifies the folders to remove from the Path environment variable..

.PARAMETER EnvironmentVariableTarget

    Specifies the "scope" to use for the Path environment variable ("Process",
    "Machine", or "User"). Defaults to "Process" if the parameter is not
    specified.

.EXAMPLE

    .\Remove-Env-Paths.ps1 C:\NotBackedUp\Public\Toolbox
#>
param(
    [parameter(Mandatory = $true, ValueFromPipeline = $true)]
    [string[]] $Folders,
    [string] $EnvironmentVariableTarget = "Process"
)

begin
{
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"

    Write-Verbose "Path environment variable target: $EnvironmentVariableTarget"

    [bool] $isInputFromPipeline = ($PSBoundParameters.ContainsKey("Folders") -eq $false)
    [int] $foldersRemoved = 0
    [string[]] $pathFolders = [Environment]::GetEnvironmentVariable("Path", $EnvironmentVariableTarget) -Split ";"
    [Collections.ArrayList] $folderList = New-Object Collections.ArrayList

    $pathFolders | foreach { $folderList.Add($_) | Out-Null }
}

process
{
    If ($isInputFromPipeline -eq $true)
    {
        $items = $_
    }
    Else
    {
        $items = $Folders
    }

    $items | foreach {
        [string] $folder = $_

        [bool] $isFolderInList = $false

        for ([int] $i = 0; $i -lt $folderList.Count; $i++)
        {
            If ([string]::Compare($folderList[$i], $folder, $true) -eq 0)
            {
                $isFolderInList = $true
                Write-Verbose ("Removing folder ($folder) from Path environment variable...")
                $folderList.RemoveAt($i)
                $i--
                $foldersRemoved++
            }
        }

        If ($isFolderInList -eq $false)
        {
            Write-Verbose ("The folder ($folder) is not specified in the Path list.")
        }
    }
}

end
{
    If ($foldersRemoved -eq 0)
    {
        Write-Verbose ("No changes to the Path environment variable are necessary.")
        return
    }

    [string] $delimitedFolders = $folderList -Join ";"
    [Environment]::SetEnvironmentVariable("Path", $delimitedFolders, $EnvironmentVariableTarget)

    Write-Verbose ("Successfully removed $foldersRemoved folder(s) from Path environment variable.")
}