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

Resuelto Deepak Kumar Padhy asked hace 8 años • 1 respuestas

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 el PASO 13, después de que el comando npm install cd..no funciona. No vuelve a la carpeta HDC principal. Tengo otros comandos para ejecutar en la carpeta principal. ¿Estoy cometiendo algunos errores de sintaxis?

Deepak Kumar Padhy avatar Jul 30 '16 23:07 Deepak Kumar Padhy
Aceptado

npmEn Windows, es un script por lotes de Windows con extensión de archivo .cmdy no un ejecutable que, en este caso, 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 obtener detalles sobre los dos comandos (directorio push y pop), abra una ventana del símbolo del sistema y ejecútelo pushd /? y popd /?se mostrará la ayuda para cada comando.

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

  1. El directorio actual es C:\Temp\HDC.
  2. El comando pushd hui-components-stylese guarda C:\Temp\HDCen la pila y se establece como nuevo directorio actual C:\Temp\HDC\hui-components-style.
  3. npmSe ejecuta lo que modifica el directorio actual.
  4. El comando popdobtiene C:\Temp\HDCde la pila y establece este directorio como directorio actual independientemente de qué directorio sea 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
call npm.cmd install --registry http://localhost:23510
popd

Es necesario utilizar el comando callporque npmes un archivo por lotes con el nombre de archivo completo npm.cmdy no un ejecutable, es decir

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

De lo contrario , el procesamiento de comandos del archivo por lotes actual continúanpm.cmd y los comandos que se encuentran en el archivo por lotes actual después de la línea con npmnunca serán procesados ​​por el procesador de comandos de Windows. Para obtener detalles sobre los distintos métodos para ejecutar un archivo por lotes, consulte la respuesta en ¿ Cómo llamar a un archivo por lotes que está un nivel por encima del directorio actual? Y vea también que la respuesta al comando copiar en un archivo por lotes no se ejecuta cuando se llama al archivo por lotes desde otro archivo por lotes, pero se ejecuta cuando hago doble clic .

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

echo STEP12
cd HDC
git config --global url."https://".insteadOf git://

echo STEP13
cd hui-components-style
setlocal
call npm.cmd install --registry http://localhost:23510
endlocal
cd ..\

El comando setlocal hace lo siguiente:

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

Esos cinco pasos siempre se realizan incluso cuando setlocalse le llama con una o dos de las cuatro opciones posibles EnableExtensions, DisableExtensions, EnableDelayedExpansion, DisableDelayedExpansionpara cambiar adicionalmente el estado de las extensiones de comando y/o la expansión retrasada de la variable de entorno.

Ahora el archivo por lotes npm.cmdpuede cambiar el directorio de trabajo actual, puede agregar, eliminar y modificar variables de entorno, puede habilitar/deshabilitar extensiones de comandos y puede habilitar/deshabilitar el uso de expansión retrasada.

Pero todas esas modificaciones en el entorno de ejecución no importan después del siguiente comando endlocal porque endlocal

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

Para ver ejemplos que demuestran que consulte las respuestas en

  • ¿Por qué se ignora mi cd %myVar%? (ejemplo de gestión del directorio de trabajo actual)
  • Hacer eco de una URL en lotes (ejemplo de variable de entorno y gestión de expansión retrasada)

Los nombres de los dos comandos se explican por sí solos:

  • setlocal ... configura el entorno de ejecución local según el entorno actual.
  • endlocal ... finaliza el entorno de ejecución local y restaura el entorno anterior.
Mofi avatar Jul 30 '2016 17:07 Mofi