Descubrí que establecer la variable de entorno PATH afecta solo al antiguo símbolo del sistema. PowerShell parece tener diferentes configuraciones de entorno. ¿Cómo cambio las variables de entorno para PowerShell (v1)?
Nota:
Quiero hacer que mis cambios sean permanentes, por lo que no tengo que configurarlo cada vez que ejecuto PowerShell. ¿PowerShell tiene un archivo de perfil? ¿Algo así como el perfil de Bash en Unix?
windows
powershell
Vasil
fuente
fuente
"
) en la variable de entorno de ruta$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
Respuestas:
El cambio de las variables de entorno reales se puede hacer utilizando la
env: namespace / drive
información. Por ejemplo, este código actualizará la variable de entorno de ruta:Hay formas de hacer que la configuración del entorno sea permanente, pero si solo las usa desde PowerShell, probablemente sea mucho mejor usar su perfil para iniciar la configuración. Al inicio, PowerShell ejecutará cualquier archivo .ps1 que encuentre en el
WindowsPowerShell
directorio bajo la carpeta Mis documentos. Por lo general, ya tiene un archivo profile.ps1 allí. El camino en mi computadora esfuente
C:\path\to\file.ext
a las variables de entorno? EDITAR: ya lo encontré. La respuesta es sí, créalo. El archivo debe consistir en 1 línea:$env:path += ;C:\path\to\file.ext"
.$env:Path = "SomeRandomPath";
En cambio, vea @mloskot, a continuación.Si, en algún momento durante una sesión de PowerShell, necesita agregar temporalmente a la variable de entorno PATH, puede hacerlo de esta manera:
fuente
$env:Path = "C:\MyPath;$env:Path"
También puede modificar las variables de entorno del usuario / sistema de forma permanente (es decir, será persistente en los reinicios del shell) con lo siguiente:
Modificar una variable de entorno del sistema
Modificar una variable de entorno del usuario
Uso de comentarios: agregar a la variable de entorno del sistema
La solución basada en cadenas también es posible si no desea escribir tipos
fuente
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine)
No verá el resultado de este cambio hasta que inicie una nueva sesión de PowerShell. Es decir, si inspecciona $ env: Path inmediatamente después de ejecutar este comando, verá qué $ env: Path era antes del comando. Para actualizar, cierre y abra el shell o inicie una nueva sesión.[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Desde el indicador de PowerShell:
Entonces deberías ver el texto:
Reinicie su sesión, y la variable estará disponible.
setx
También se puede utilizar para establecer variables arbitrarias. Escribasetx /?
en la solicitud de documentación.Antes de jugar con su ruta de esta manera, asegúrese de guardar una copia de su ruta actual haciendo
$env:path >> a.out
en un indicador de PowerShell.fuente
$env:PATH
primero, luegosetx /m PATH "$env:PATH"
para que se aplique local y globalmente sin reinicio de shell?Al igual que la respuesta de JeanT , quería una abstracción en torno a agregar al camino. A diferencia de la respuesta de JeanT, la necesitaba para funcionar sin la interacción del usuario. Otro comportamiento que estaba buscando:
$env:Path
para que el cambio surta efecto en la sesión actualEn caso de que sea útil, aquí está:
Echa un vistazo a mi esencia para la
Remove-EnvPath
función correspondiente .fuente
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 lograr eso, obviamente también puede usar PowerShell:
Más información está en la publicación del blog Use PowerShell para modificar su ruta ambiental
Si usa extensiones de comunidad de PowerShell, el comando adecuado para agregar una ruta a la ruta de la variable de entorno es:
fuente
Todas las respuestas que sugieren un cambio permanente tienen el mismo problema: rompen el valor del registro de ruta.
SetEnvironmentVariable
convierte elREG_EXPAND_SZ
valor%SystemRoot%\system32
en unREG_SZ
valor deC:\Windows\system32
.Cualquier otra variable en la ruta también se pierde. Agregar nuevos usando
%myNewPath%
ya no funcionará.Aquí hay un script
Set-PathVariable.ps1
que utilizo para solucionar este problema:Explico el problema con más detalle en una publicación de blog .
fuente
Esto establece la ruta para la sesión actual y solicita al usuario que la agregue permanentemente:
Puede agregar esta función a su perfil predeterminado, (
Microsoft.PowerShell_profile.ps1
), generalmente ubicado en%USERPROFILE%\Documents\WindowsPowerShell
.fuente
Sobre la base de la respuesta de @Michael Kropat, agregué un parámetro para anteponer la nueva ruta a la
PATH
variable existente y una comprobación para evitar la adición de una ruta no existente:fuente
Como Jonathan Leaders mencionó aquí , es importante ejecutar el comando / script elevado para poder cambiar las variables de entorno para 'máquina' , pero ejecutar algunos comandos elevados no tiene que hacerse con las Extensiones de comunidad, por lo que me gustaría para modificar y ampliar la respuesta de JeanT de una manera, que las variables de máquina de cambio también se pueden realizar incluso si el script en sí no se ejecuta elevado:
fuente
La mayoría de las respuestas no se refieren a UAC . Esto cubre problemas de UAC.
Primero instale PowerShell Community Extensions: a
choco install pscx
través de http://chocolatey.org/ (puede que tenga que reiniciar su entorno de shell).Luego habilite pscx
Luego usa
Invoke-Elevated
fuente
Mi sugerencia es esta:
He probado esto para agregar
C:\oracle\x64\bin
a la variable de entorno de formaPath
permanente y esto funciona bien.La primera forma es simplemente hacer:
Pero este cambio no es permanente.
$env:path
volverá de forma predeterminada a lo que era antes tan pronto como cierre su terminal PowerShell y lo vuelva a abrir. Esto se debe a que ha aplicado el cambio a nivel de sesión y no a nivel de origen (que es el nivel de registro). Para ver el valor global de$env:path
, haga:O más específicamente:
Ahora para cambiar esto, primero capturamos la ruta original que necesita ser modificada:
Ahora definimos cómo debería ser la nueva ruta. En este caso estamos agregando una nueva carpeta:
Nota: asegúrese de que
$newpath
ve como quiere que se vea. De lo contrario, podría dañar su sistema operativo.Ahora aplique el nuevo valor:
Ahora haga una comprobación final de que se ve como espera:
Ahora puede reiniciar su terminal PowerShell (o incluso reiniciar la máquina) y ver que no vuelva a su valor anterior.
Tenga en cuenta que el orden de las rutas puede cambiar para que esté en orden alfabético, así que asegúrese de verificar toda la línea. Para hacerlo más fácil, puede dividir la salida en filas utilizando el punto y coma como delimitador:
fuente
Abra PowerShell y ejecute:
fuente
Dentro de PowerShell, uno puede navegar al directorio de variables de entorno escribiendo:
Esto lo llevará al directorio Env:>. Desde este directorio:
Para ver todas las variables de entorno, escriba:
Para ver una variable de entorno específica, escriba:
Para establecer una variable de entorno, escriba:
Para eliminar una variable de entorno, escriba:
Hay más información en Acerca de las variables de entorno .
fuente
Traté de optimizar un poco el código de SBF y Michael para hacerlo más compacto.
Confío en la coerción de tipo de PowerShell, donde convierte automáticamente las cadenas en valores de enumeración, por lo que no definí el diccionario de búsqueda.
También saqué el bloque que agrega la nueva ruta a la lista en función de una condición, de modo que el trabajo se realiza una vez y se almacena en una variable para su reutilización.
Luego se aplica de forma permanente o solo a la sesión dependiendo de la
$PathContainer
parámetro.Podemos poner el bloque de código en una función o un archivo ps1 que llamamos directamente desde el símbolo del sistema. Fui con DevEnvAddPath.ps1.
Hago algo similar para un DevEnvRemovePath.ps1.
Hasta ahora, parecen funcionar.
fuente
Solo las respuestas que introducen el valor en el registro afectan un cambio permanente (por lo que la mayoría de las respuestas en este hilo, incluida la respuesta aceptada, no afectan permanentemente
Path
).La siguiente función funciona tanto para
Path
/PSModulePath
como paraUser
/System
tipos. También agregará la nueva ruta a la sesión actual de forma predeterminada.fuente