gpt4 book ai didi

node.js - 在Windows批处理文件中运行nodejs句柄时无法返回到原始工作目录

转载 作者:太空宇宙 更新时间:2023-11-04 00:49:07 25 4
gpt4 key购买 nike

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

2.bat - 当“做某事”运行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

但是,如果原始文件没有返回到以前的事件目录,这也将失败。

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

要调用子批处理文件并将执行流返回给调用者,您需要使用call命令

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

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

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

现在,执行流程不会返回到调用者,但也不需要这样做。当子批处理文件 (handlebars) 结束时,批处理上下文将被释放,并且 setlocal 后对环境的更改将被恢复。

关于node.js - 在Windows批处理文件中运行nodejs句柄时无法返回到原始工作目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33316372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com