改变目录命令CD .. npm安装后不能在batch file中工作

我在一个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 .. 

在STEP13中,npm install命令cd..不工作。 它不会回到父HDC文件夹。 我有其他命令在父文件夹中运行。我是否犯了一些语法错误?

npm是修改当前目录的可执行文件或脚本,在退出之前不会恢复它。

我build议使用,而不是

 cd hui-components-style 

命令

 pushd hui-components-style 

并用而不是

 cd .. 

命令

 popd 

有关2命令的详细信息 – push和pop目录 – 打开命令提示符窗口并运行pushd /?popd /? 显示每个命令的帮助。

使用绝对path更好地理解的解释。

  1. 当前目录是C:\Temp\HDC
  2. 命令pushd hui-components-styleC:\Temp\HDC保存在堆栈中,并设置为新的当前目录C:\Temp\HDC\hui-components-style
  3. 执行npm修改当前目录。
  4. popd命令从堆栈中获取C:\Temp\HDC ,并将此目录设置为当前目录,而不pipe目录是哪个目录。

所以这两个修改的代码是:

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

如果npm是batch file,则需要使用命令call ,即

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

否则,当前batch file的命令处理在npm.bat继续 ,并且在使用npm的行不会被Windows命令解释器处理之后,当前batch file中的任何命令都将被处理。 有关执行batch file的各种方法的详细信息,请参阅如何调用batch file的答案,即从当前目录起两个级别 。 另请参阅batch file中的复制命令时从另一个batch file调用batch file时没有得到执行,但是当我双击时正在执行 。

或者,也可以使用以下代码:

 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 ..\ 

命令setlocal如下:

  1. 它将当前目录的path推到堆栈上。
  2. 它推动堆栈上的命令扩展状态。
  3. 它推动堆栈延迟扩展的状态。
  4. 它将当前环境variables表的内存地址压入堆栈。
  5. 它在内存中创build当前环境variables表的副本,并使这个新的环境variables表成为活动状态。

即使setlocal被4个可能的选项EnableExtensionsDisableExtensionsEnableDelayedExpansionDisableDelayedExpansion 1个或2个调用,这5个步骤也总是完成,以另外改变命令扩展的状态和/或延迟的环境variables扩展。

现在npm可以改变当前的工作目录,可以添加,删除和修改环境variables,可以启用/禁用命令扩展,也可以启用/禁用延迟扩展的使用。

但是所有那些在命令处理环境上的修改并不重要,因为下一个命令endlocal是因为endlocal

  1. 删除当前环境表;
  2. 从堆栈中popup前一个环境表的内存地址,并使用该地址导致恢复初始环境variables;
  3. 从堆栈popup延迟扩展的状态,并相应地禁用/启用延迟扩展;
  4. 从堆栈中popup命令扩展的状态并相应地禁用/启用命令扩展;
  5. 从堆栈中popup以前的当前目录path,并将当前目录设置为该path以还原当前目录。

举例说明,看看答案

  • 为什么我的cd%myVar%被忽略? (当前工作目录pipe理的例子)
  • 在批处理中回显URL (环境variables和延迟扩展pipe理的示例)

这两个命令的名字实际上是自我解释的:

  • setlocal …根据当前环境设置本地命令进程环境。
  • endlocal …结束本地命令进程环境并恢复以前的环境。