当 运行 nodejs handlebars 在 windows 批处理文件中时无法返回到原始工作目录

Cannot back to original working directory when running nodejs handlebars in windows batch file

1.bat - 按预期执行:转到临时文件夹,执行某些操作,return 到原始文件夹。当前工作目录(cwd)在运行1.bat.

前后相同

2.bat - 当 'do something' 是 运行 handlebars nodejs 包时,即使它只打印一些东西,退出批处理文件后,cwd 更改.

3.bat - 不使用 PUSHD、POPD。与 2.bat.

相同

当运行类似shell脚本时,cwd永远不会改变。

问题:怎么了?如何回到原来的cwd?

REM  1.bat
PUSHD %CD%
CD /D %TEMP%
DIR
POPD 

REM  2.bat
PUSHD %CD%
CD /D %TEMP%
handlebars --help
POPD 

REM  3.bat
SET orgdir=%CD%
CD /D %TEMP%
handlebars --help
CD /D %orgdir%

如您所说,这有效

REM  1.bat
PUSHD %CD%
CD /D %TEMP%
DIR
POPD 

但这不应该这样写。

  • pushd 的工作方式是保存当前的活动目录(稍后由 popd 检索),然后更改为指示的目录,如果需要更改驱动单元和如有必要,在更改为 UNC 路径时映射驱动器号。

  • 路径应该被引用以避免空格或特殊字符的问题

所以,代码应该是

REM  1.bat
PUSHD "%temp%"
DIR
POPD 

现在,有问题的批处理文件可能

REM  2.bat
PUSHD "%temp%"
handlebars --help
POPD 

但是,如果原始文件没有return到以前的活动目录,这也将失败。

为什么?在 windows handlebars 命令中是一个批处理文件。当一个批处理文件调用另一个批处理文件时,执行流程将转移到被调用的文件而不是 return 到调用者,因此 popd 将不会被执行。

要调用子批处理文件并将执行流程 return 传递给调用者,您需要使用 call 命令

REM  2.bat
PUSHD "%temp%"
call handlebars --help
POPD 

另一种选择在这种情况下(如果您不需要以更改任何环境变量结束,也不需要继续在调用方中执行命令)是使用setlocal 命令。它保存当前环境的副本,以允许我们在调用 endlocal 命令或批处理上下文结束时放弃对其所做的任何更改。此保存操作包括当前活动目录。

REM  2.bat
setlocal
cd /d "%temp%"
handlebars --help

现在,执行流程不会 return 到调用者,但不需要。当子批处理文件 (handlebars) 结束时,批处理上下文被释放,setlocal 之后对环境的更改被还原。