Public/Remove-PSUUserEnvironmentVariable.ps1

function Remove-PSUUserEnvironmentVariable {
    <#
    .SYNOPSIS
        Removes one or more user environment variables.
 
    .DESCRIPTION
        Deletes user-scoped environment variables from both the registry and the current session.
        Supports wildcards, confirmation prompts, verbose output, force deletion, and pipeline input.
 
    .PARAMETER Name
        The name (or wildcard pattern) of the environment variable(s) to remove.
 
    .PARAMETER Force
        Bypasses confirmation prompts and deletes variables without asking.
 
    .EXAMPLE
        Remove-PSUUserEnvironmentVariable -Name 'MY_SECRET' -Confirm
 
    .EXAMPLE
        Remove-PSUUserEnvironmentVariable -Name '*KEY*' -Force -Verbose
 
    .EXAMPLE
        'MY_SECRET' | Remove-PSUUserEnvironmentVariable -Force
 
    .NOTES
        Author: Lakshmanachari Panuganti
        File Creation Date: 2025-07-27
    #>

    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')]
    param (
        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [string[]]$Name,

        [switch]$Force
    )

    process {
        foreach ($pattern in $Name) {
            $registryPath = 'HKCU:\Environment'
            $userVars = Get-Item -Path $registryPath | Get-ItemProperty | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name
            $matchedNames = $userVars | Where-Object { $_ -like $pattern }

            if (-not $matchedNames) {
                Write-Warning "No environment variable(s) found matching '$pattern'."
                continue
            }

            foreach ($varName in $matchedNames) {
                if ($PSCmdlet.ShouldProcess("Environment Variable '$varName'", "Remove")) {
                    try {
                        if ($Force -or $PSCmdlet.ShouldContinue("Remove environment variable '$varName'?", "Confirm removal")) {
                            # Remove from registry
                            Remove-ItemProperty -Path $registryPath -Name $varName -ErrorAction Stop

                            # Remove from current session
                            if (Test-Path -Path "Env:\$varName") {
                                Remove-Item -Path "Env:\$varName" -ErrorAction SilentlyContinue
                            }

                            Write-Verbose "Removed variable '$varName' from registry and session."
                        }
                    } catch {
                        Write-Warning "Failed to remove '$varName': $_"
                    }
                }
            }
        }
    }
}