usar que ise desinstalar como comandos administrador windows powershell

que - Configuración de la variable de ruta de Windows PowerShell



windows powershell vs cmd (12)

Descubrí que la configuración de la variable de entorno PATH solo afecta al indicador de comandos anterior. PowerShell parece tener diferentes configuraciones de entorno. ¿Cómo cambio las variables de entorno para PowerShell (v1)?

Nota:

Quiero que mis cambios sean permanentes, por lo que no tengo que configurarlo cada vez que ejecuto PowerShell. ¿Tiene PowerShell un archivo de perfil? ¿Algo así como el perfil de Bash en Unix?


Al igual que la respuesta de JeanT , quería una abstracción sobre la adición al camino. A diferencia de la respuesta de JeanT, la necesitaba para ejecutarse sin interacción del usuario. Otro comportamiento que estaba buscando:

  • Actualizaciones $env:Path para que el cambio surta efecto en la sesión actual
  • Persiste el cambio de variable de entorno para futuras sesiones.
  • No agrega una ruta duplicada cuando ya existe la misma ruta

En caso de que sea útil, aquí está:

function Add-EnvPath { param( [Parameter(Mandatory=$true)] [string] $Path, [ValidateSet(''Machine'', ''User'', ''Session'')] [string] $Container = ''Session'' ) if ($Container -ne ''Session'') { $containerMapping = @{ Machine = [EnvironmentVariableTarget]::Machine User = [EnvironmentVariableTarget]::User } $containerType = $containerMapping[$Container] $persistedPaths = [Environment]::GetEnvironmentVariable(''Path'', $containerType) -split '';'' if ($persistedPaths -notcontains $Path) { $persistedPaths = $persistedPaths + $Path | where { $_ } [Environment]::SetEnvironmentVariable(''Path'', $persistedPaths -join '';'', $containerType) } } $envPaths = $env:Path -split '';'' if ($envPaths -notcontains $Path) { $envPaths = $envPaths + $Path | where { $_ } $env:Path = $envPaths -join '';'' } }

Echa un vistazo a mi gist para la correspondiente función Remove-EnvPath .


Aunque la respuesta aceptada actual funciona en el sentido de que la variable de ruta se actualiza permanentemente desde el contexto de PowerShell, en realidad no actualiza la variable de entorno almacenada en el registro de Windows.

Para lograrlo, obviamente puedes usar PowerShell también:

$oldPath=(Get-ItemProperty -Path ''Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment'' -Name PATH).Path $newPath=$oldPath+’;C:/NewFolderToAddToTheList/’ Set-ItemProperty -Path ''Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment'' -Name PATH –Value $newPath

Más información está en la publicación del blog. Use PowerShell para modificar su ruta ambiental.

Si usa las extensiones de la comunidad de PowerShell, el comando adecuado para agregar una ruta a la variable de entorno es:

Add-PathVariable "C:/NewFolderToAddToTheList" -Target Machine


Como mencionó Jonathan Leaders here , es importante ejecutar el comando / script elevado para poder cambiar las variables de entorno para ''máquina'' , pero ejecutar algunos comandos elevado no tiene que hacerse con las extensiones comunitarias, por lo que me gustaría para modificar y extender share una manera, el cambio de variables de la máquina también se puede realizar incluso si el script en sí no se ejecuta elevado:

function Set-Path ([string]$newPath, [bool]$permanent=$false, [bool]$forMachine=$false ) { $Env:Path += ";$newPath" $scope = if ($forMachine) { ''Machine'' } else { ''User'' } if ($permanent) { $command = "[Environment]::SetEnvironmentVariable(''PATH'', $env:Path, $scope)" Start-Process -FilePath powershell.exe -ArgumentList "-noprofile -command $Command" -Verb runas } }


Desde el indicador de PowerShell:

setx PATH "$env:path;/the/directory/to/add" -m

Entonces deberías ver el texto:

SUCCESS: Specified value was saved.

Reinicie su sesión, y la variable estará disponible. setx también se puede utilizar para establecer variables arbitrarias. Escriba setx /? en la solicitud de documentación.

Antes de jugar con su ruta de esta manera, asegúrese de guardar una copia de su ruta existente haciendo $env:path >> a.out en un indicador de PowerShell.


El cambio de las variables de entorno reales se puede hacer usando la información de env: namespace / drive . Por ejemplo, este código actualizará la variable de entorno de ruta:

$env:Path = "SomeRandomPath";

Hay formas de hacer que la configuración del entorno sea permanente, pero si solo las está usando desde PowerShell, probablemente sea mucho mejor usar su perfil para iniciar la configuración. En el inicio, PowerShell ejecutará cualquier archivo .ps1 que encuentre en el directorio de WindowsPowerShell en la carpeta Mis documentos. Normalmente tienes un archivo profile.ps1 ya allí. El camino en mi computadora es

c:/Users/JaredPar/Documents/WindowsPowerShell/profile.ps1


Esto establece la ruta para la sesión actual y le pide al usuario que la agregue permanentemente:

function Set-Path { param([string]$x) $Env:Path+= ";" + $x Write-Output $Env:Path $write = Read-Host ''Set PATH permanently ? (yes|no)'' if ($write -eq "yes") { [Environment]::SetEnvironmentVariable("Path",$env:Path, [System.EnvironmentVariableTarget]::User) Write-Output ''PATH updated'' } }

Puede agregar esta función a su perfil predeterminado, ( Microsoft.PowerShell_profile.ps1 ), que generalmente se encuentra en %USERPROFILE%/Documents/WindowsPowerShell .


La mayoría de las respuestas no están dirigidas a UAC . Esto cubre cuestiones de UAC.

Primero instale PowerShell Community Extensions: choco install pscx través de http://chocolatey.org/ (puede que tenga que reiniciar su entorno de shell).

Entonces habilita pscx

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx

Luego usa Invoke-Elevated

Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR


MI SUGERENCIA ES ESTE ES QUE HE PROBADO ESTE PARA AGREGAR C: / oracle / x64 / bin a la Ruta de forma permanente y esto funciona bien.

$ENV:PATH

La primera forma es simplemente hacer:

$ENV:PATH=”$ENV:PATH;c:/path/to/folder”

Pero este cambio no es permanente, $ env: path volverá de manera predeterminada a lo que era antes tan pronto como cierre su terminal powershell y vuelva a abrirlo. Esto se debe a que ha aplicado el cambio en el nivel de sesión y no en el nivel de origen (que es el nivel de registro). Para ver el valor global de $ env: path, haz:

Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment’ -Name PATH

o, más específicamente:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment’ -Name PATH).path

Ahora para cambiar esto, primero capturamos la ruta original que necesita ser modificada:

$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment’ -Name PATH).path

Ahora definimos cómo debería ser la nueva ruta, en este caso estamos agregando una nueva carpeta:

$newpath = “$oldpath;c:/path/to/folder”

Nota: asegúrese de que el $ newpath tenga el aspecto que desea, si no, podría dañar su sistema operativo.

Ahora aplique el nuevo valor:

Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment’ -Name PATH -Value $newPath

Ahora haga una última comprobación para ver cómo se ve:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment’ -Name PATH).Path

Ahora puede reiniciar su terminal powershell (o incluso reiniciar la máquina) y ver que no vuelve a su valor anterior otra vez. Tenga en cuenta que el orden de las rutas puede cambiar para que esté en orden alfabético, así que asegúrese de revisar toda la línea, para hacerlo más fácil, puede dividir la salida en filas usando el punto y coma como un delimitador:

($env:path).split(“;”)


Si, durante algún tiempo durante una sesión de PowerShell, necesita adjuntar temporalmente a la variable de entorno PATH, puede hacerlo de esta manera:

$env:Path += ";C:/Program Files/GnuWin32/bin"


Sobre la base de la respuesta de @Michael Kropat, agregué un parámetro para anteponer la nueva ruta a la variable PATH existente y una verificación para evitar la adición de una ruta no existente:

function Add-EnvPath { param( [Parameter(Mandatory=$true)] [string] $Path, [ValidateSet(''Machine'', ''User'', ''Session'')] [string] $Container = ''Session'', [Parameter(Mandatory=$False)] [Switch] $Prepend ) if (Test-Path -path "$Path") { if ($Container -ne ''Session'') { $containerMapping = @{ Machine = [EnvironmentVariableTarget]::Machine User = [EnvironmentVariableTarget]::User } $containerType = $containerMapping[$Container] $persistedPaths = [Environment]::GetEnvironmentVariable(''Path'', $containerType) -split '';'' if ($persistedPaths -notcontains $Path) { if ($Prepend) { $persistedPaths = ,$Path + $persistedPaths | where { $_ } [Environment]::SetEnvironmentVariable(''Path'', $persistedPaths -join '';'', $containerType) } else { $persistedPaths = $persistedPaths + $Path | where { $_ } [Environment]::SetEnvironmentVariable(''Path'', $persistedPaths -join '';'', $containerType) } } } $envPaths = $env:Path -split '';'' if ($envPaths -notcontains $Path) { if ($Prepend) { $envPaths = ,$Path + $envPaths | where { $_ } $env:Path = $envPaths -join '';'' } else { $envPaths = $envPaths + $Path | where { $_ } $env:Path = $envPaths -join '';'' } } } }


También puede modificar las variables de entorno de usuario / sistema de forma permanente (es decir, será persistente en los reinicios de shell) con lo siguiente:

### Modify a system environment variable ### [Environment]::SetEnvironmentVariable ("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine) ### Modify a user environment variable ### [Environment]::SetEnvironmentVariable ("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User) ### Usage from comments - add to the system environment variable ### [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:/bin", [EnvironmentVariableTarget]::Machine)


Todas las respuestas que sugieren un cambio permanente tienen el mismo problema: rompen el valor del registro de la ruta.

SetEnvironmentVariable convierte el valor REG_EXPAND_SZ %SystemRoot%/system32 en un valor REG_SZ de C:/Windows/system32 .

Cualquier otra variable en el camino también se pierde. Agregar nuevos usando %myNewPath% no funcionará más.

Aquí hay un script Set-PathVariable.ps1 que uso para solucionar este problema:

[CmdletBinding(SupportsShouldProcess=$true)] param( [parameter(Mandatory=$true)] [string]$NewLocation) Begin { #requires –runasadministrator $regPath = "SYSTEM/CurrentControlSet/Control/Session Manager/Environment" $hklm = [Microsoft.Win32.Registry]::LocalMachine Function GetOldPath() { $regKey = $hklm.OpenSubKey($regPath, $FALSE) $envpath = $regKey.GetValue("Path", "", [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) return $envPath } } Process { # Win32API error codes $ERROR_SUCCESS = 0 $ERROR_DUP_NAME = 34 $ERROR_INVALID_DATA = 13 $NewLocation = $NewLocation.Trim(); If ($NewLocation -eq "" -or $NewLocation -eq $null) { Exit $ERROR_INVALID_DATA } [string]$oldPath = GetOldPath Write-Verbose "Old Path: $oldPath" # Check whether the new location is already in the path $parts = $oldPath.split(";") If ($parts -contains $NewLocation) { Write-Warning "The new location is already in the path" Exit $ERROR_DUP_NAME } # Build the new path, make sure we don''t have double semicolons $newPath = $oldPath + ";" + $NewLocation $newPath = $newPath -replace ";;","" if ($pscmdlet.ShouldProcess("%Path%", "Add $NewLocation")){ # Add to the current session $env:path += ";$NewLocation" # Save into registry $regKey = $hklm.OpenSubKey($regPath, $True) $regKey.SetValue("Path", $newPath, [Microsoft.Win32.RegistryValueKind]::ExpandString) Write-Output "The operation completed successfully." } Exit $ERROR_SUCCESS }

Explico el problema con más detalle en una publicación de blog .