mirror of
https://github.com/ScoopInstaller/Scoop.git
synced 2025-11-15 22:16:35 +00:00
177 lines
5.1 KiB
PowerShell
177 lines
5.1 KiB
PowerShell
# System-related functions
|
|
|
|
## Environment Variables
|
|
|
|
function Publish-EnvVar {
|
|
if (-not ('Win32.NativeMethods' -as [Type])) {
|
|
Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition @'
|
|
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
|
public static extern IntPtr SendMessageTimeout(
|
|
IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
|
|
uint fuFlags, uint uTimeout, out UIntPtr lpdwResult
|
|
);
|
|
'@
|
|
}
|
|
|
|
$HWND_BROADCAST = [IntPtr] 0xffff
|
|
$WM_SETTINGCHANGE = 0x1a
|
|
$result = [UIntPtr]::Zero
|
|
|
|
[Win32.NativeMethods]::SendMessageTimeout($HWND_BROADCAST,
|
|
$WM_SETTINGCHANGE,
|
|
[UIntPtr]::Zero,
|
|
'Environment',
|
|
2,
|
|
5000,
|
|
[ref] $result
|
|
) | Out-Null
|
|
}
|
|
|
|
function Get-EnvVar {
|
|
param(
|
|
[string]$Name,
|
|
[switch]$Global
|
|
)
|
|
|
|
$registerKey = if ($Global) {
|
|
Get-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager'
|
|
} else {
|
|
Get-Item -Path 'HKCU:'
|
|
}
|
|
$envRegisterKey = $registerKey.OpenSubKey('Environment')
|
|
$registryValueOption = [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames
|
|
$envRegisterKey.GetValue($Name, $null, $registryValueOption)
|
|
}
|
|
|
|
function Set-EnvVar {
|
|
param(
|
|
[string]$Name,
|
|
[string]$Value,
|
|
[switch]$Global
|
|
)
|
|
|
|
$registerKey = if ($Global) {
|
|
Get-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager'
|
|
} else {
|
|
Get-Item -Path 'HKCU:'
|
|
}
|
|
$envRegisterKey = $registerKey.OpenSubKey('Environment', $true)
|
|
if ($null -eq $Value -or $Value -eq '') {
|
|
if ($envRegisterKey.GetValue($Name)) {
|
|
$envRegisterKey.DeleteValue($Name)
|
|
}
|
|
} else {
|
|
$registryValueKind = if ($Value.Contains('%')) {
|
|
[Microsoft.Win32.RegistryValueKind]::ExpandString
|
|
} elseif ($envRegisterKey.GetValue($Name)) {
|
|
$envRegisterKey.GetValueKind($Name)
|
|
} else {
|
|
[Microsoft.Win32.RegistryValueKind]::String
|
|
}
|
|
$envRegisterKey.SetValue($Name, $Value, $registryValueKind)
|
|
}
|
|
Publish-EnvVar
|
|
}
|
|
|
|
function Split-PathLikeEnvVar {
|
|
param(
|
|
[string[]]$Pattern,
|
|
[string]$Path
|
|
)
|
|
|
|
if ($null -eq $Path -and $Path -eq '') {
|
|
return $null, $null
|
|
} else {
|
|
$splitPattern = $Pattern.Split(';', [System.StringSplitOptions]::RemoveEmptyEntries)
|
|
$splitPath = $Path.Split(';', [System.StringSplitOptions]::RemoveEmptyEntries)
|
|
$inPath = @()
|
|
foreach ($p in $splitPattern) {
|
|
$inPath += $splitPath.Where({ $_ -like $p })
|
|
$splitPath = $splitPath.Where({ $_ -notlike $p })
|
|
}
|
|
return ($inPath -join ';'), ($splitPath -join ';')
|
|
}
|
|
}
|
|
|
|
function Add-Path {
|
|
param(
|
|
[string[]]$Path,
|
|
[string]$TargetEnvVar = 'PATH',
|
|
[switch]$Global,
|
|
[switch]$Force,
|
|
[switch]$Quiet
|
|
)
|
|
|
|
# future sessions
|
|
$inPath, $strippedPath = Split-PathLikeEnvVar $Path (Get-EnvVar -Name $TargetEnvVar -Global:$Global)
|
|
if (!$inPath -or $Force) {
|
|
if (!$Quiet) {
|
|
$Path | ForEach-Object {
|
|
Write-Host "Adding $(friendly_path $_) to $(if ($Global) {'global'} else {'your'}) path."
|
|
}
|
|
}
|
|
Set-EnvVar -Name $TargetEnvVar -Value ((@($Path) + $strippedPath) -join ';') -Global:$Global
|
|
}
|
|
# current session
|
|
$inPath, $strippedPath = Split-PathLikeEnvVar $Path $env:PATH
|
|
if (!$inPath -or $Force) {
|
|
$env:PATH = (@($Path) + $strippedPath) -join ';'
|
|
}
|
|
}
|
|
|
|
function Remove-Path {
|
|
param(
|
|
[string[]]$Path,
|
|
[string]$TargetEnvVar = 'PATH',
|
|
[switch]$Global,
|
|
[switch]$Quiet,
|
|
[switch]$PassThru
|
|
)
|
|
|
|
# future sessions
|
|
$inPath, $strippedPath = Split-PathLikeEnvVar $Path (Get-EnvVar -Name $TargetEnvVar -Global:$Global)
|
|
if ($inPath) {
|
|
if (!$Quiet) {
|
|
$Path | ForEach-Object {
|
|
Write-Host "Removing $(friendly_path $_) from $(if ($Global) {'global'} else {'your'}) path."
|
|
}
|
|
}
|
|
Set-EnvVar -Name $TargetEnvVar -Value $strippedPath -Global:$Global
|
|
}
|
|
# current session
|
|
$inSessionPath, $strippedPath = Split-PathLikeEnvVar $Path $env:PATH
|
|
if ($inSessionPath) {
|
|
$env:PATH = $strippedPath
|
|
}
|
|
if ($PassThru) {
|
|
return $inPath
|
|
}
|
|
}
|
|
|
|
## Deprecated functions
|
|
|
|
function env($name, $global, $val) {
|
|
if ($PSBoundParameters.ContainsKey('val')) {
|
|
Show-DeprecatedWarning $MyInvocation 'Set-EnvVar'
|
|
Set-EnvVar -Name $name -Value $val -Global:$global
|
|
} else {
|
|
Show-DeprecatedWarning $MyInvocation 'Get-EnvVar'
|
|
Get-EnvVar -Name $name -Global:$global
|
|
}
|
|
}
|
|
|
|
function strip_path($orig_path, $dir) {
|
|
Show-DeprecatedWarning $MyInvocation 'Split-PathLikeEnvVar'
|
|
Split-PathLikeEnvVar -Pattern @($dir) -Path $orig_path
|
|
}
|
|
|
|
function add_first_in_path($dir, $global) {
|
|
Show-DeprecatedWarning $MyInvocation 'Add-Path'
|
|
Add-Path -Path $dir -Global:$global -Force
|
|
}
|
|
|
|
function remove_from_path($dir, $global) {
|
|
Show-DeprecatedWarning $MyInvocation 'Remove-Path'
|
|
Remove-Path -Path $dir -Global:$global
|
|
}
|