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

Dee*_*dhy 3 batch-file node.js npm

我在一个 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 ..
Run Code Online (Sandbox Code Playgroud)

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

Mof*_*ofi 5

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

我建议使用而不是

cd hui-components-style
Run Code Online (Sandbox Code Playgroud)

命令

pushd hui-components-style
Run Code Online (Sandbox Code Playgroud)

并使用代替

cd ..
Run Code Online (Sandbox Code Playgroud)

命令

popd
Run Code Online (Sandbox Code Playgroud)

有关 push 和 pop directory 这两个命令的详细信息,请打开命令提示符窗口并运行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
Run Code Online (Sandbox Code Playgroud)

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

call npm.cmd install --registry http://localhost:23510
Run Code Online (Sandbox Code Playgroud)

否则当前批处理文件的命令处理将继续进行,npm.cmd并且当前批处理文件中的任何命令npm都不会被 Windows 命令处理器处理。有关执行批处理文件的各种方法的详细信息,请参阅有关如何调用当前目录上一级的批处理文件的答案另请参阅有关从另一个批处理文件调用批处理文件时未执行批处理文件中的复制命令的答案,但在我双击时会执行

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

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 ..\
Run Code Online (Sandbox Code Playgroud)

命令setlocal执行以下操作:

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

那些五个步骤总是即使进行setlocal被称为一个或两个的四个可能的选项EnableExtensionsDisableExtensionsEnableDelayedExpansionDisableDelayedExpansion额外地改变命令扩展和/或延迟的环境变量扩展的状态。

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

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

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

有关证明的示例,请参阅上的答案

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

  • setlocal ... 根据当前环境设置本地执行环境。
  • endlocal ...结束本地执行环境并恢复以前的环境。