批处理文件中的"cd .."命令在npm安装后不起作用。

5
我有一个批处理文件中包含以下命令。
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 install --registry http://localhost:23510 && cd .. - Arif Khan
@ArifKhan:非常感谢,它似乎对我有用。还有一个疑问,如果我有两个npm链接语句,我应该如何编写它们?我需要通过&&将它们组合起来吗? - Deepak Kumar Padhy
1个回答

6

npm是Windows上的一个批处理脚本,文件扩展名为.cmd,不是可执行文件。在这种情况下,它会修改当前目录并在退出前不会恢复。

我建议使用代替:

cd hui-components-style

该命令

pushd hui-components-style

使用代替

cd ..

指令

popd

要了解有关两个命令 - push 和 pop directory - 的详细信息,请打开命令提示符窗口并运行 pushd /?popd /? 以显示每个命令的帮助。

使用绝对路径进行更好理解的说明:

  1. 当前目录为 C:\Temp\HDC
  2. 命令 pushd hui-components-styleC:\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

由于npm是一个完整文件名为npm.cmd的批处理文件,而不是可执行文件,所以必须使用call命令。

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

否则,当前批处理文件的命令处理将在 npm.cmd 上继续执行,而在带有 npm 的行之后的当前批处理文件中的任何命令都将不被 Windows 命令处理器处理。有关执行批处理文件的各种方法的详细信息,请参见如何调用一个与当前目录相邻的批处理文件?上的回答。另请参见从另一个批处理文件调用批处理文件时未执行 copy 命令,但是双击时执行了该命令上的回答。
或者也可以使用以下代码:
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. 在内存中创建当前环境变量表的副本,并使这个新的环境变量表成为活动的环境变量表。
即使使用了四个可能的选项之一或两个选项 EnableExtensions, DisableExtensions, EnableDelayedExpansion, DisableDelayedExpansion 调用 setlocal,这五个步骤总是会被执行,以便 附加地 更改命令扩展和 / 或延迟环境变量扩展的状态。
现在,批处理文件 npm.cmd 可以更改当前工作目录、添加、删除和修改环境变量、启用/禁用命令扩展,以及启用/禁用延迟扩展。
但是,在下一个命令 endlocal 之后,对执行环境的所有这些修改都不再起作用,因为 endlocal
  1. 删除当前环境表;
  2. 从堆栈中弹出上一个环境表的内存地址,使用该地址来恢复初始环境变量;
  3. 从堆栈中弹出延迟扩展状态并相应地禁用/启用延迟扩展;
  4. 从堆栈中弹出命令扩展的状态,并相应地禁用/启用命令扩展;
  5. 从堆栈中弹出以前的当前目录路径,并将当前目录设置为该路径,以还原当前目录。
有关演示示例,请参见以下答案: 这两个命令的名称实际上是自我解释的:
  • setlocal … 基于当前环境设置本地执行环境。
  • endlocal … 结束本地执行环境并恢复以前的环境。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接