【问题标题】:change directory command cd ..not working in batch file after npm install更改目录命令 cd ..在 npm install 后无法在批处理文件中工作
【发布时间】:2016-12-05 04:37:51
【问题描述】:

我在一个 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 install --registry http://localhost:23510 && cd ..
  • @ArifKhan:非常感谢,它似乎对我有用。还有一个疑问,如果我有 2 个 npm 链接语句,我应该怎么写?我需要通过&& 合并它们吗?

标签: node.js batch-file npm


【解决方案1】:

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

我建议使用代替

cd hui-components-style

命令

pushd hui-components-style

并使用而不是

cd ..

命令

popd

有关这两个命令的详细信息 - 推送和弹出目录 - 打开命令提示符窗口并运行 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

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

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

否则当前批处理文件的命令处理将在npm.cmd继续,并且当前批处理文件中npm 行之后的任何命令都不会被 Windows 命令处理器处理。有关执行批处理文件的各种方法的详细信息,请参阅How to call a batch file that is one level up from the current directory? 上的答案,另请参阅copy command in batch file is not getting executed when calling the batch file from another batch file, but is getting executed when I double click 上的答案。

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

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. 它会在内存中创建当前环境变量表的副本,并激活这个新的环境变量表。

即使使用 EnableExtensionsDisableExtensionsDisableExtensionsEnableDelayedExpansionDisableDelayedExpansion 四个可能选项中的一个或两个调用 setlocal另外 更改,这五个步骤也始终完成命令扩展的状态和/或延迟的环境变量扩展。

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

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

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

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

这两个命令的名字其实不言自明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2010-09-30
    • 2011-11-25
    相关资源
    最近更新 更多