Node.js 在windows批处理文件中运行nodejs Handlebar时无法返回原始工作目录
1.bat-按预期执行:转到临时文件夹,执行某些操作,返回原始文件夹。当前工作目录(cwd)在运行1.bat前后相同 2.bat-当“do something”运行Handlebar nodejs包时,即使它只打印某些内容,退出批处理文件后,cwd也会更改 3.bat-不使用PUSHD、POPD。与2.bat相同 在运行类似的shell脚本时,cwd从不更改 问题是:怎么了?如何回到原来的cwdNode.js 在windows批处理文件中运行nodejs Handlebar时无法返回原始工作目录,node.js,batch-file,handlebars.js,Node.js,Batch File,Handlebars.js,1.bat-按预期执行:转到临时文件夹,执行某些操作,返回原始文件夹。当前工作目录(cwd)在运行1.bat前后相同 2.bat-当“do something”运行Handlebar nodejs包时,即使它只打印某些内容,退出批处理文件后,cwd也会更改 3.bat-不使用PUSHD、POPD。与2.bat相同 在运行类似的shell脚本时,cwd从不更改 问题是:怎么了?如何回到原来的cwd REM 1.bat PUSHD %CD% CD /D %TEMP% DIR POPD 正如
REM 1.bat
PUSHD %CD%
CD /D %TEMP%
DIR
POPD
正如您所指出的,这是有效的
REM 1.bat
PUSHD %CD%
CD /D %TEMP%
DIR
POPD
但这不是应该怎么写的
的工作原理是保存当前active directory(稍后由pushd
检索),然后更改为指定的active directory,根据需要更改驱动器单元,并在更改为UNC路径时映射驱动器号(如有必要)popd
- 应引用路径,以避免出现空格或特殊字符问题
REM 1.bat
PUSHD "%temp%"
DIR
POPD
现在,有问题的批处理文件可能是
但是,如果原始文件没有返回到以前的active directory,这也将失败
为什么??在windows中,handlebar命令是一个批处理文件。当一个批处理文件调用另一个批处理文件时,执行流被传输到被调用的文件,而不会返回给调用者,因此,popd
将不会执行
要调用子批处理文件并将执行流返回给调用者,需要使用call
命令
REM 2.bat
PUSHD "%temp%"
call handlebars --help
POPD
这种情况下的另一种选择(如果不需要以任何环境变量的更改结束,也不需要继续在调用者中执行命令)是使用setlocal
命令。它保存当前环境的一个副本,以允许我们在调用endlocal
命令或批处理上下文结束时放弃对其所做的任何更改。此保存操作包括当前active directory
REM 2.bat
setlocal
cd /d "%temp%"
handlebars --help
现在,执行流不会返回到调用方,但它不是必需的。当子批处理文件(handlebar
)结束时,批处理上下文被释放,并且在setlocal
之后对环境的更改被还原
REM 2.bat
PUSHD "%temp%"
handlebars --help
POPD
REM 2.bat
PUSHD "%temp%"
call handlebars --help
POPD
REM 2.bat
setlocal
cd /d "%temp%"
handlebars --help