当 运行 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
之后对环境的更改被还原。
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
之后对环境的更改被还原。