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

时间:2016-07-30 16:33:25

标签: node.js batch-file 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 ..

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

1 个答案:

答案 0 :(得分:2)

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

我建议使用而不是

cd hui-components-style

命令

pushd hui-components-style

并使用而不是

cd ..

命令

popd

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

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

  1. 当前目录为C:\Temp\HDC
  2. 命令pushd hui-components-styleC:\Temp\HDC保存在堆栈上并设置为新的当前目录C:\Temp\HDC\hui-components-style
  3. 执行
  4. npm修改当前目录。
  5. 命令popd从堆栈中获取C:\Temp\HDC并将此目录设置为当前目录,与当前目录无关。
  6. 所以带有这两个修改的代码是:

    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继续,并且在Windows命令永远不会处理npm行之后当前批处理文件中的任何命令处理器。有关执行批处理文件的各种方法的详细信息,请参阅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. 它在内存中创建当前环境变量表的副本,并使此新环境变量表处于活动状态。
    6. 即使setlocal使用4个可能选项中的1个或2个EnableExtensionsDisableExtensionsEnableDelayedExpansionDisableDelayedExpansion,也始终执行这5个步骤另外更改命令扩展的状态和/或延迟的环境变量扩展。

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

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

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

        上的答案

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

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