CDSoft.PowerShell/EnvVar.ps1

function ValidateEnvVarName($Name) {
    if ($Name -in 'Path', 'TEMP', 'TMP', 
    'ComSpec', 'DriverData', 'NUMBER_OF_PROCESSORS', 'OS', 'PATHEXT', 
    'POWERSHELL_DISTRIBUTION_CHANNEL', 'PROCESSOR_ARCHITECTURE', 'PROCESSOR_IDENTIFIER',
    'PROCESSOR_LEVEL', 'PROCESSOR_REVISION',
    'PSModulePath', 'USERNAME', 'windir') {
        throw "You cannot edit important EnvVar: $Name."
    }
}

function ConvertVarType($VarType) {
    if (($VarType -eq 'User') -or ($VarType -eq 'Machine')) {
        return $VarType
    }
    elseif ($VarType -eq 0) {
        return 'Machine'
    }
    elseif ($VarType -eq 1) {
        return 'User'
    }
    else {
        throw "VarType $VarType is wrong. Can only be among 4 kinds of value: Machine (or 0) User (or 1)"
    }
}

function Set-SystemEnvVar {
    <#
    .SYNOPSIS
    ���»������û���ϵͳ����������ֵ�����õأ���
    .DESCRIPTION
    ���»������û���ϵͳ����������ֵ�����õأ���������ڣ�����£���������ڣ������á�
    .PARAMETER Name
    ��������������
    .PARAMETER Value
    ֵ
    .PARAMETER VarType
    �������������ͣ�����Ϊ��������ֵ��User Machine 1 (= User) 0 (= Machine)
    .EXAMPLE
    Set-SystemEnvVar OneDriveB E:/OneDriveB
    .OUTPUTS
    void
    #>

    [CmdletBinding()]
    PARAM(
        [parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
        [String] $Name,
        [parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
        [String] $Value,
        [String] $VarType = "User"
    )
    BEGIN {
        ValidateEnvVarName $Name
        $VarType = ConvertVarType $VarType
    }
    PROCESS {
        $oldValue = [System.Environment]::GetEnvironmentVariable($Name)
        if ($Value -eq $oldValue) {
            Write-Verbose "δ���� $VarType ���͵Ļ������� $Name����Ϊ��ͬ��ֵ�Ѵ��ڡ�"
            return
        }
        Set-Item -Path "env:$Name" -Value $Value
        [Environment]::SetEnvironmentVariable($Name, $Value, $VarType)
        if ($oldValue -eq $null) {
            Write-Verbose "�ѽ� $VarType ���͵Ļ������� $Name ��ֵ���������ڣ�����Ϊ $Value��"
        }
        else {
            Write-Verbose "�ѽ� $VarType ���͵Ļ������� $Name ��ֵ����Ϊ $Value��"
        }
        return
    }
}

function Add-PathEnvVar {
    <#
    .SYNOPSIS
    ���Խ�һ��·����ӵ� PATH ���������С�
    .DESCRIPTION
    ���Խ�һ��·����ӵ� PATH ���������С�
    .PARAMETER Path
    ��������������
    .PARAMETER VarType
    �������������ͣ�����Ϊ��������ֵ��User Machine 1 (= User) 0 (= Machine)
    .EXAMPLE
    Add-PathEnvVar -Path E:\Temp -VarType User
    .EXAMPLE
    Add-PathEnvVar -Path E:\Temp
    .OUTPUTS
    void
    #>

    [CmdletBinding()]
    PARAM(
        [parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
        [String] $Path,
        [String] $VarType = "User"
    )
    BEGIN {
        $VarType = ConvertVarType $VarType
        $Path = $Path.Replace('/', '\').TrimEnd('\')
    }
    PROCESS {
        $allPath = [System.Environment]::GetEnvironmentVariable('Path', $VarType)
        if ($allPath -like "*$Path*") {
            Write-Verbose "δ�� $VarType ���͵� Path �����������·�� $Path����Ϊ���Ѵ��ڡ�"
        }
        else {
            $allPath += ';'
            $allPath += $Path
            Set-Item -Path "env:Path" -Value $allPath
            [Environment]::SetEnvironmentVariable('Path', $allPath, $VarType)
            Write-Verbose "���� $VarType ���͵� Path �����������·�� $Path��"
        }
    }
}