小编典典

npm安装后更改目录命令cd ..不能在批处理文件中工作

node.js

我在一个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中,在npminstall命令cd..不起作用之后。它不会返回到父HDC文件夹。我还有其他命令要在父文件夹中运行。我是否犯了一些语法错误?


阅读 370

收藏
2020-07-07

共1个答案

小编典典

npm在Windows上是Windows批处理脚本,具有文件扩展名,.cmd而不是可执行文件,在这种情况下,该脚本会修改当前目录,并且在退出前不会还原该目录。

我建议使用代替

cd hui-components-style

命令

pushd hui-components-style

并使用代替

cd ..

命令

popd

有关这两个命令(push和pop目录)的详细信息,请打开命令提示符窗口,然后运行pushd /?popd /?显示每个命令的帮助。

使用绝对路径可以更好地理解的说明。

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

因此,经过这两个修改的代码是:

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

必须使用命令,call因为它是npm具有完整文件名npm.cmd而不是可执行文件的批处理文件,即

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

否则,将 继续
执行当前批处理文件的npm.cmd命令,并且npmWindows命令处理器将永远不会处理与行之后的当前批处理文件中的任何命令。

另外,也可以使用以下代码:

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

setlocal 命令执行以下操作:

  1. 它将当前目录的路径压入堆栈。
  2. 它将命令扩展的状态压入堆栈。
  3. 它将延迟扩展的状态推入堆栈。
  4. 它将当前环境变量表的内存地址压入堆栈。
  5. 它在内存中创建当前环境变量表的副本,并使该新环境变量表处于活动状态。

这些5个步骤总是即使进行setlocal被称为具有1或的4个可能的选项2
EnableExtensionsDisableExtensionsEnableDelayedExpansionDisableDelayedExpansion
额外地 改变命令扩展和/或延迟的环境变量扩展的状态。

现在,批处理文件npm.cmd可以更改当前工作目录,可以添加,删除和修改环境变量,可以启用/禁用命令扩展,以及可以启用/禁用延迟扩展的用法。

但是在下一个命令 endlocal 之后,对命令处理环境的所有修改都无关紧要,因为 endlocal

  1. 删除当前环境表;
  2. 从堆栈中弹出先前环境表的内存地址,并使用该地址来恢复初始环境变量;
  3. 从堆栈中弹出延迟扩展的状态,并相应地禁用/启用延迟扩展;
  4. 从堆栈弹出命令扩展的状态,并相应地禁用/启用命令扩展;
  5. 从堆栈中弹出先前的当前目录路径,并将当前目录设置为此路径以还原当前目录。

这两个命令的名称实际上是不言自明的:

  • setlocal …根据当前环境设置本地命令进程环境。
  • endlocal …结束本地命令进程环境并还原以前的环境。
2020-07-07