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': $_" } } } } } } |