在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
之后的环境变化被还原。