在Windowsbatch file中运行nodejs句柄时,无法恢复到原来的工作目录

1.bat – 如预期的那样:转到临时文件夹,执行某些操作,返回到原始文件夹。 当前工作目录(cwd)在运行1.bat之前和之后是相同的。

2.bat – 当“执行某些事情”正在运行handlebars nodejs包时,即使它只打印某些内容, 在退出batch file之后,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检索)然后更改为指定的目录,根据需要更改驱动器单元,必要时更改驱动器号,必要时更改为UNCpath时映射驱动器号。

  • 引用path以避免空格或特殊字符的问题

所以,代码应该是

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

现在,有问题的batch file可能

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

但是,如果原始文件没有返回到前一个活动目录,这也将无法完成。

为什么? 在windows handlebars命令是一个batch file。 当一个batch file调用另一个文件时,执行stream程将被转移到被调用文件中,而不会返回给调用者,所以popd将不会被执行。

要调用一个子batch file并将执行stream返回给调用者,您将需要使用call命令

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

在这种情况下,另一种方法是使用setlocal命令(如果不需要在任何环境variables中结束并在调用setlocal继续执行命令)。 它保存当前环境的副本,以便在调用endlocal命令或批处理上下文结束时放弃对其进行的任何更改。 该保存操作包括当前的活动目录。

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

现在,执行stream程不会返回给调用者,但它不是必需的。 当子batch file( handlebars )结束时,批处理上下文被释放, setlocal之后的环境变化被还原。