Pase la variable de entorno Node.js con Windows PowerShell

Estoy intentando pasar una variable de entorno a Node.js con PowerShell de esta manera:

C:\Users\everton\my-project> $env:MY_VAR = 8000 node index.js 

Pero me sale un error en PowerShell:

Token ‘nodo’ expresión o statement inesperada

3 Solutions collect form web for “Pase la variable de entorno Node.js con Windows PowerShell”

Establezca la variable de entorno MY_VAR primero y ejecute su aplicación de esta manera:

 C:\Users\everton\my-project> $env:MY_VAR="8000" ; node index.js 

Puede acceder a la variable de entorno MY_VAR dentro de index.js por

 process.env.MY_VAR 

Nota: PowerShell no admite directamente variables de entorno de ámbito de comando. El comando anterior establece la variable de entorno para esa sesión de PowerShell.

Nota: si puede asumir que Node.js ya está instalado, como ocurre por definición cuando invoca el node , considere el uso de paquetes de ayuda npm , como se muestra en la útil respuesta de Cyril CHAPON .
Esta respuesta se enfoca en soluciones genéricas desde PowerShell.

tl; dr

 # Set env. variable temporarily, invoke the external utility, remove / restre old value. $oldVal, $env:MYVAR = $env:MYVAR, 8000; node index.js; $env:MYVAR = $oldVal # More structured alternative that uses a local variable. & { $oldVal, $env:MY_VAR = $env:MY_VAR, 8000; node index.js; $env:MY_VAR = $oldVal } 

Más simplemente, si no hay MY_VAR valor MY_VAR preexistente que deba restaurarse.

 $env:MYVAR=8000; node index.js; $env:MYVAR=$null # More structured alternative & { $env:MY_VAR=8000; node index.js; $env:MY_VAR=$null } 

Vea a continuación una explicación y una alternativa basada en una función auxiliar.


Para complementar la respuesta efectiva de Harikrishnan :

PowerShell no tiene un equivalente al método de scope de comando para pasar las variables de entorno que ofrecen los shells de tipo POSIX ; p.ej:

  # Eg, in Bash: # Define environment variable MY_VAR for the child process being invoked (`node`) # ONLY; in other words: MY_VAR is scoped to the command being invoked # (subsequent commands do not see it). MY_VAR=8000 node index.js 

En PowerShell, como lo demuestra la respuesta de Harikrishnan, primero debe definir la variable de entorno y luego, en una statement separada , llamar al proceso hijo, por lo que $env:MY_VAR="8000"; node index.js $env:MY_VAR="8000"; node index.js es la solución PowerShell correcta, pero no vale nada que $env:MY_VAR permanezca dentro del scope durante el rest de la sesión (se establece en el nivel de proceso ).

Tenga en cuenta que incluso el uso de un bloque de script invocado con & para crear un ámbito secundario no ayuda aquí, porque dichos ámbitos secundarios solo se aplican a las variables de PowerShell , no a las variables de entorno .

Por supuesto, puede eliminar la variable de entorno manualmente después de la llamada del node :
Remove-Item env:MY_VAR o incluso $env:MY_VAR = $null , que es lo que muestra el primer comando en la parte superior.


Una alternativa más estructurada , quizás mejor en el caso de establecer múltiples variables de entorno y / o invocar múltiples comandos, es usar un bloque de script invocado con & :

 & { $oldVal, $env:MY_VAR = $env:MY_VAR, 8000; node index.js; $env:MY_VAR = $oldVal } 

Esto se aprovecha de:

  • { ... } es un bloque de script que proporciona una agrupación claramente visible para los comandos que contiene; invocada con & , crea un ámbito local, de modo que la variable de ayuda $oldVal sale automáticamente del ámbito al salir del bloque.

  • $oldVal, $env:MY_VAR = $env:MY_VAR, 8000 guarda el valor anterior (si existe) de $env:MY_VAR en $oldVal al cambiar el valor a 8000 ; esta técnica de asignación a múltiples variables a la vez (conocida como asignación de desestructuración en algunos idiomas) se explica en Get-Help about_Assignment_Operators , sección “ASIGNAR VARIALBES MÚLTIPLES”.

Alternativamente , use la función de ayuda a continuación , o use un enfoque try { ... } finally { ... } , como se demuestra en esta respuesta mía relacionada .


Función auxiliar para modificaciones de entorno de comando.

Si define la función de ayuda a continuación (recuerde que las definiciones de función deben colocarse antes de invocarlas), puede lograr una modificación de su entorno a nivel de comando de la siguiente manera:

 # Invoke `node index.js` with a *temporarily* set MY_VAR environment variable. Invoke-WithEnvironment @{ MY_VAR = 8000 } { node index.js } 

Código fuente de Invoke-WithEnvironment() :

 function Invoke-WithEnvironment { < # .SYNOPSIS Invokes commands with a temporarily modified environment. .DESCRIPTION Modifies environment variables temporarily based on a hashtable of values, invokes the specified script block, then restores the previous environment. .PARAMETER Environment A hashtable that defines the temporary environment-variable values. Assign $null to (temporarily) remove an environment variable that is currently set. .PARAMETER ScriptBlock The command(s) to execute with the temporarily modified environment. .EXAMPLE > Invoke-WithEnvironment @{ PORT=8080 } { node index.js } Runs node with environment variable PORT temporarily set to 8080, with its previous value, if any #> param( [Parameter(Mandatory)] [System.Collections.IDictionary] $Environment, [Parameter(Mandatory)] [scriptblock] $ScriptBlock ) # Modify the environment based on the hashtable and save the original # one for later restration. $htOrgEnv = @{} foreach ($kv in $Environment.GetEnumerator()) { $htOrgEnv[$kv.Key] = (Get-Item -EA SilentlyContinue "env:$($kv.Key)").Value Set-Item "env:$($kv.Key)" $kv.Value } # Invoke the script block try { & $ScriptBlock } finally { # Restore the original environment. foreach ($kv in $Environment.GetEnumerator()) { # Note: setting an environment var. to $null or '' *removes* it. Set-Item "env:$($kv.Key)" $htOrgEnv[$kv.Key] } } } 

Mi respuesta requiere el uso de las bibliotecas Node.js y npm.

… o simplemente elimina el dolor de escribir scripts de lenguaje WTF obscuro, y usa uno de los scripts de Node.js de ámbito de comando (más multiplataforma):

  • cross-env (para inline)

     cross-env MYVAR=MYVALUE node index.js 
  • env-cmd (del archivo .env)

     env-cmd .env node index.js 

    con

     #.env file MYVAR=MYVALUE 
  • NodeJS Basic FileIO
  • ¿Cómo puedo detectar si quicktime está instalado con javascript?
  • Cómo llegar caminando o manejando distancia a través de google maps con php
  • No se puede hacer una llamada ajax desde una vista web en la aplicación Windows 10 Cordova
  • convirtiendo javascript en exe, WScript no ha sido declarado
  • Comunicación entre windows / tabs con JavaScript
  • (javascript) o (nodejs en windows) iconv desde utf-8 a iso
  • TRACKER: error TRK0005: Error al localizar: "CL.exe". El sistema no puede encontrar el file especificado
  • Protobuf con NodeJS en Windows
  • Manejo de notificación de tostadas en Windows Phone 8.1 cuando la aplicación está cerrada
  • Ejecutando `grunt` en VM Shanetworking Directory
  • Carácter de Newline que trabaja para console.log () pero no para el browser Chrome
  • ¿Cuál es la diferencia entre setInterval (func) y setInterval (function () {func ()})
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.