SystemPath.psm1

#region Get-SystemPath
Function Get-SystemPath
{
    <#
    .SYNOPSIS
    Retrieves the folders in the system path.
 
    .DESCRIPTION
    The Get-SystemPath function uses the registry and the environmental variables to retrieve the folders in the system path
 
    .PARAMETER AsString
    Returns the path as a single string.
 
    .PARAMETER Active
    Displays the folders in the current path using the PATH variable
 
    .EXAMPLE
    Get the folders in the PATH
 
    Get-SystemPath
 
    .EXAMPLE
    Get the folders in the PATH as single string
 
    Get-SystemPath -AsString
 
    .EXAMPLE
    Get the folders in the PATH as it is currently in the system. Event if changes are made to the PATH, a system reboot is
    required in order for changes to take affect.
 
    Get-SystemPath -Active
 
    .NOTES
    You need to run this function as a member of the Administrators group.
 
    #>


    Param
    (
        [switch]$AsString,
        [switch]$Active
    )

    # Get current PATH
    $CurrentPath=(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).Path

    if($AsString)
    {
        if( $Active )
        {
            return $env:Path
        }
        else
        {
        return $CurrentPath
        }
    }
    else
    {
        $directories = @()
        if($Active)
        {
            $directories = $env:Path.Split(';')
        }
        else
        {
            $directories = $currentpath.Split(';')
        }

        foreach($d in $directories)
        {
            $obj = New-Object psobject
            $obj | Add-Member -MemberType NoteProperty -Name Path -Value $d

            $obj
        }
    }
}
#endregion

#region Add-SystemPath
Function Add-SystemPath
{
    <#
    .SYNOPSIS
    Adds a folder to the system path.
 
    .DESCRIPTION
    The Add-SystemPath function uses the registry to add folders to the system path
 
    .PARAMETER Path
    The path to add the PATH variable
 
    .EXAMPLE
    Add D:\MyFolder to the PATH
 
    Add-SystemPath "D:\MyFolder"
 
    .EXAMPLE
    Add C:\App1 and D:\App2 to the PATH
 
    Add-SystemPath -Path "C:\App1","D:\App2"
 
    .NOTES
    You need to run this function as a member of the Administrators group. Moreover, a system reboot is required in order for
    changes to take affect.
 
    #>


    Param
    (
        [parameter(
            Mandatory=$True,
            ValueFromPipeline=$True,
            Position=0
        )]
        [String[]]$Path
    )

    # Get the current PATH
    $CurrentPath= Get-SystemPath -AsString
    $NewPath = $CurrentPath

    foreach($p in $Path)
    {
        # Test if folder to be added to the PATH exists
        If( !(Test-Path $p))
        {
            Write-Error ("Folder " + $p + " does not exist!")
            continue
        }

        # Test if the folder already exists in the PATH
        $currentPathDirectories = Get-SystemPath
        $found = 0
        foreach($d in $currentPathDirectories)
        {
            if( $d -eq $p )
            {
                Write-Warning ("Folder " + $p + " already exists in PATH")
                $fount = 1
                continue
            }
        }

        if( $found -eq 1)
        {
            continue
        }

        # Form the New Path
        $NewPath = $NewPath + ’;’ +$p
    }

    # Set the new path
    Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH –Value $newPath
}
#endregion

#region Remove-SystemPath
function Remove-SystemPath
{
    <#
    .SYNOPSIS
    Removes a folder from the system path.
 
    .DESCRIPTION
    The Remove-SystemPath function uses the registry to remove folders from the system path
 
    .PARAMETER Path
    The path to remove from the PATH variable
 
    .EXAMPLE
    Remove D:\MyFolder from the PATH
 
    Remove-SystemPath "D:\MyFolder"
 
    .EXAMPLE
    Remove C:\App1 and D:\App2 from the PATH
 
    Remove-SystemPath -Path "C:\App1","D:\App2"
 
    .NOTES
    You need to run this function as a member of the Administrators group. Moreover, a system reboot is required in order for
    changes to take affect.
 
    #>


    Param
    (
        [parameter(
            Mandatory=$True,
            ValueFromPipeline=$True,
            Position=0
        )]
        [String[]]$Path
    )

    # Get the current PATH
    $CurrentPath=Get-SystemPath -AsString
    $newpath = ""

    foreach($p in $Path)
    {
        # Test if the folder exists in the PATH
        $currentPathDirectories = Get-SystemPath
        $found = 0
        foreach($d in $currentPathDirectories)
        {
            if( $d.Path -eq $p )
            {
                $found = 1
                break
            }
        }
        if($found -eq 0)
        {
            Write-Error ("Folder " + $p + " does not exist in PATH")
            continue
        }
    }

    # Form the New Path
    foreach($d in $currentPathDirectories)
    {
        if(!$Path.Contains($d.path))
        {
            $newpath += $d.path + ";"
        }

    }    

    # Remove the last ";"
    $newPath = $newPath.Remove($newPath.Length - 1)

    # Set the new path
    Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH –Value $newPath
}
#endregion

#region Exports
Export-ModuleMember -Function Get-SystemPath
Export-ModuleMember -Function Add-SystemPath
Export-ModuleMember -Function Remove-SystemPath
#endregion