The following Powershell script works very well for this:
Remove-PathFolders -Folders "*\Java\jdk*" -EnvironmentVariableTarget $([System.EnvironmentVariableTarget]::Machine)
$jdkDp = (Get-ChildItem -Path "C:\Program Files (x86)\Java\jdk*" | Sort-Object name | Select-Object -Last 1).FullName
Add-PathFolders -Folders $($jdkDp + "\bin\") -EnvironmentVariableTarget $([System.EnvironmentVariableTarget]::Machine)
Get-PathFolders -EnvironmentVariableTarget $([System.EnvironmentVariableTarget]::Machine)
Which use the following custom functions inspired from here (you can include everything in the same UpdateJavaPath.ps1
script):
<#
.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-PathFolders.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-PathFolders.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.
#>
Function Get-PathFolders() {
param(
[string] $EnvironmentVariableTarget = "Process")
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
[string[]] $pathFolders = [Environment]::GetEnvironmentVariable(
"Path",
$EnvironmentVariableTarget) -Split ";"
If ($pathFolders -ne $null)
{
Write-Output $pathFolders
}
}
<#
.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-PathFolders.ps1 C:\NotBackedUp\Public\Toolbox
#>
Function Add-PathFolders() {
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.")
}
}
<#
.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-PathFolders.ps1 C:\NotBackedUp\Public\Toolbox
#>
Function Remove-PathFolders(){
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)
if (($folderList[$i] -like $folder) -or ($folderList[$i] -eq ""))
{
$isFolderInList = $true
Write-Verbose ("Removing folder ($folderList[$i]) 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.")
}
}