改变目录命令CD .. npm安装后不能在batch file中工作
我在一个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
是修改当前目录的可执行文件或脚本,在退出之前不会恢复它。
我build议使用,而不是
cd hui-components-style
命令
pushd hui-components-style
并用而不是
cd ..
命令
popd
有关2命令的详细信息 – push和pop目录 – 打开命令提示符窗口并运行pushd /?
和popd /?
显示每个命令的帮助。
使用绝对path更好地理解的解释。
- 当前目录是
C:\Temp\HDC
。 - 命令
pushd hui-components-style
将C:\Temp\HDC
保存在堆栈中,并设置为新的当前目录C:\Temp\HDC\hui-components-style
。 - 执行
npm
修改当前目录。 -
popd
命令从堆栈中获取C:\Temp\HDC
,并将此目录设置为当前目录,而不pipe目录是哪个目录。
所以这两个修改的代码是:
echo STEP12 cd HDC git config --global url."https://".insteadOf git:// echo STEP13 pushd hui-components-style npm install --registry http://localhost:23510 popd
如果npm
是batch file,则需要使用命令call
,即
call npm install --registry http://localhost:23510
否则,当前batch file的命令处理在npm.bat
上继续 ,并且在使用npm
的行不会被Windows命令解释器处理之后,当前batch file中的任何命令都将被处理。 有关执行batch file的各种方法的详细信息,请参阅如何调用batch file的答案,即从当前目录起两个级别 。 另请参阅batch file中的复制命令时从另一个batch file调用batch file时没有得到执行,但是当我双击时正在执行 。
或者,也可以使用以下代码:
echo STEP12 cd HDC git config --global url."https://".insteadOf git:// echo STEP13 cd hui-components-style setlocal npm install --registry http://localhost:23510 endlocal cd ..\
命令setlocal如下:
- 它将当前目录的path推到堆栈上。
- 它推动堆栈上的命令扩展状态。
- 它推动堆栈延迟扩展的状态。
- 它将当前环境variables表的内存地址压入堆栈。
- 它在内存中创build当前环境variables表的副本,并使这个新的环境variables表成为活动状态。
即使setlocal
被4个可能的选项EnableExtensions
, DisableExtensions
, EnableDelayedExpansion
, DisableDelayedExpansion
1个或2个调用,这5个步骤也总是完成,以另外改变命令扩展的状态和/或延迟的环境variables扩展。
现在npm
可以改变当前的工作目录,可以添加,删除和修改环境variables,可以启用/禁用命令扩展,也可以启用/禁用延迟扩展的使用。
但是所有那些在命令处理环境上的修改并不重要,因为下一个命令endlocal是因为endlocal
- 删除当前环境表;
- 从堆栈中popup前一个环境表的内存地址,并使用该地址导致恢复初始环境variables;
- 从堆栈popup延迟扩展的状态,并相应地禁用/启用延迟扩展;
- 从堆栈中popup命令扩展的状态并相应地禁用/启用命令扩展;
- 从堆栈中popup以前的当前目录path,并将当前目录设置为该path以还原当前目录。
举例说明,看看答案
- 为什么我的cd%myVar%被忽略? (当前工作目录pipe理的例子)
- 在批处理中回显URL (环境variables和延迟扩展pipe理的示例)
这两个命令的名字实际上是自我解释的:
- setlocal …根据当前环境设置本地命令进程环境。
- endlocal …结束本地命令进程环境并恢复以前的环境。