cambiar el comando del directorio cd … no funciona en el archivo por lotes después de la instalación de npm

Tengo el siguiente comando en un archivo bat.

echo STEP12 cd HDC git config --global url."https://".insteadOf git:// echo STEP13 cd hui-components-style npm install --registry http://localhost:23510 cd .. 

En STEP13, después de npm install command cd.. no funciona. No regresa a la carpeta padre HDC. Tengo otros comandos para ejecutar en la carpeta principal. ¿Estoy haciendo algunos errores de syntax?

npm es un ejecutable o script que modifica el directorio actual y no lo restaura antes de salir.

Sugiero usar en lugar de

 cd hui-components-style 

El comando

 pushd hui-components-style 

y usar en lugar de

 cd .. 

El comando

 popd 

Para detalles sobre los 2 comandos – push y pop directory – abre una ventana de símbolo del sistema y ejecuta pushd /? y popd /? para que se muestre la ayuda para cada comando.

Una explicación para una mejor comprensión usando rutas absolutas.

  1. El directorio actual es C:\Temp\HDC .
  2. El comando pushd hui-components-style guarda C:\Temp\HDC en la stack y establece como nuevo directorio actual C:\Temp\HDC\hui-components-style .
  3. Se ejecuta npm que modifica el directorio actual.
  4. El comando popd obtiene C:\Temp\HDC de la stack y establece este directorio como el directorio actual independiente de en qué directorio está el directorio actual.

Entonces el código con esas dos modificaciones es:

 echo STEP12 cd HDC git config --global url."https://".insteadOf git:// echo STEP13 pushd hui-components-style npm install --registry http://localhost:23510 popd 

Si npm es un archivo por lotes, es necesario usar la call comando, es decir,

 call npm install --registry http://localhost:23510 

De lo contrario, el procesamiento del comando del archivo por lotes actual continúa en npm.bat y los comandos que estén en el archivo por lotes actual después de que la línea con npm nunca sea procesada por el intérprete de comandos de Windows. Para obtener más información sobre los distintos métodos para ejecutar un archivo por lotes, consulte la respuesta sobre Cómo llamar a un archivo por lotes, es decir, dos niveles desde el directorio actual . Y ver también, la respuesta al comando copiar en el archivo por lotes no se ejecuta cuando se llama al archivo por lotes desde otro archivo por lotes, sino que se ejecuta cuando hago doble clic .

Alternativamente, también sería posible usar el siguiente código:

 echo STEP12 cd HDC git config --global url."https://".insteadOf git:// echo STEP13 cd hui-components-style setlocal npm install --registry http://localhost:23510 endlocal cd ..\ 

El comando setlocal hace lo siguiente:

  1. Impulsa la ruta del directorio actual en la stack.
  2. Impulsa el estado de las extensiones de comando en la stack.
  3. Impulsa el estado de expansión retardada en la stack.
  4. Empuja la dirección de memoria de la tabla de variables de entorno actual en la stack.
  5. Crea una copia de la tabla de variables de entorno actual en la memoria y hace que esta nueva tabla de variables de entorno esté activa.

Esos 5 pasos siempre se realizan incluso cuando se llama a setlocal con 1 o 2 de las 4 opciones posibles EnableExtensions , DisableExtensions , EnableDelayedExpansion , DisableDelayedExpansion para cambiar adicionalmente el estado de las extensiones de comando y / o la expansión de la variable de entorno diferido.

Ahora npm puede cambiar el directorio de trabajo actual, puede agregar, eliminar y modificar variables de entorno, puede habilitar / deshabilitar extensiones de comando y puede habilitar / deshabilitar el uso de expansión demorada.

Pero todas esas modificaciones en el entorno de procesamiento de comandos no importan después del próximo comando endlocal porque endlocal

  1. borra la tabla de entorno actual;
  2. muestra la dirección de memoria de la tabla de entorno anterior de la stack y utiliza esta dirección, lo que da como resultado la restauración de variables de entorno iniciales;
  3. revela el estado de expansión retrasada de la stack y desactiva / habilita la expansión retardada en consecuencia;
  4. muestra el estado de las extensiones de comando desde la stack y deshabilita / habilita las extensiones de comando en consecuencia;
  5. muestra la ruta del directorio actual anterior de la stack y establece el directorio actual en esta ruta para restaurar el directorio actual.

Para ejemplos que demuestren que vea las respuestas en

  • ¿Por qué mi cd% myVar% es ignorado? (ejemplo para la administración actual del directorio de trabajo)
  • Hacer eco de una URL en Batch (ejemplo de variable de entorno y administración de expansión retrasada)

Los nombres de los dos comandos son en realidad autoexplicativos:

  • setlocal … configura el entorno de proceso de comando local basado en el entorno actual.
  • endlocal … finaliza el entorno de proceso de comando local y restablece el entorno anterior.